close

[Swift5]エラーコードの意味とか解消方法とか[随時更新]

公開日:

Xcodeで各種エラーが発生した場合、解決までのプロセスの備忘録です。

コンテンツ 非表示

エラー:Unexpectedly found nil while implicitly unwrapping an Optional value

Unexpectedly found nil while implicitly unwrapping an Optional value

nilを強制アンラップしているエラーのように見えるが、Labelそのものがnilである=つまり接続不能という場合もこのエラーが表示されるようだ。

よって、値を見る→接続を確認。の順序で特定していく。

発生箇所

cell.<ラベル名>.text = <配列名>[indexPath.row].message

1:print()で値が正常か確認

print(<配列名>[indexPath.row].message)

が表示されるか

結果:値に問題はなかった

2:Labelの接続を疑い。確認作業。

切り離して繋ぎ直した。

結果:特に変わらず

3:cellを呼び込んでいるコードを確認

tableView.register(UINib(nibName: "<cellのクラス>", bundle: nil), forCellReuseIdentifier: "Cell")

結果:上記Cellの部分が誤っていた

原因:セルのidentifierには「cell」と設定していたため接続ができておらず結果、labelとも接続できていなかった。

修正:上記Cellをcellに修正し完了。

エラー:this class is not key value coding-compliant for the key

原因:Labelなど部品をStoryboardから接続した際、削除し忘れの重複だった

修正:部品を右クリックしたら現れるウインドウから、該当の箇所を削除(下の画像)

Thread 1: Fatal error: Index out of range

原因:配列の実際のindexよりも大きいindexの値を指定してしまっている

Result of call to ‘XXXXX’ is unused

返り値が未指定である

返り値が適切な箇所に返っていないということだと思われる。

経緯

cocoapodsからインストールしたFSCalendarなどのフレームワークに用意された関数を、ViewWillAppear内で記述した場合に発生。

予想

関数を入れ子にするとフレームワーク内で、入れ子関数を使用する設定にしないとそもそも発動しない(返り値が返らない)ということになる(?)

Protocol type ‘Any’ cannot conform to ‘Equatable’ because only concrete types can conform to protocols

訳:プロトコルタイプ「Any」は「Equatable」に準拠できません。具体的なタイプのみがプロトコルに準拠できるためです。

例:

if anyArray.contains(date){
                 return 1
             }

anyArrayが[Any]型、dateがDate型である場合containsで比較できません。という意味になります。

Cannot call value of non-function type

関数で規定されている型と異なる型を指定している

Cannot capture ‘XXXX’ before it is declared

その変数(定数)は事前に宣言されていない。

事前に宣言されている場合も、重複して宣言してしまっている場合は、後の宣言のみが有効になるため、このエラーが出ます。

Failed to render and update auto layout status for ViewController

podが古いことが原因で上のエラーが発生している場合

ターミナルで対象のプロジェクトのフォルダを指定して pod update

Multiple inheritance from classes ‘XXXXX’ and ‘XXXXX’

Swiftは多重継承ができません。

Class1を Class2で継承しようとすると表示されます。
(記述の凡ミスでした)
Class2において継承ではなくインスタンス化が正解でした。

variable used within its own initial value

自作したClass NotificationsSet{ } をインスタンス化しようと以下のコードを打った時に発生

  let NotificationsSet = NotificationsSet()

30分ほど悩みました。
– 再帰的な問題なのは確かなのですが、クラスには問題がない。
– インスタンス化の時点でエラーが発生するのはなぜだ。

Classと同じ文字列の場合、同じものとして扱われる

解決しました。
以下に変更することで解決しました

 let notificationsSet = NotificationsSet()

定数名とClass名が大文字小文字含め、同一の場合、同じものを代入していることになり、再帰的な問題が発生しているものと思われます(予想)

※定数、変数は小文字から。Classは大文字から。

いつも統一しているのですが、今回はたまたま記述ミスをしました。
今回のエラーとは関係ないですが、大文字小文字はそれぞれ統一しておくとミスは起こらないですね。

Cannot assign value of type ‘ArraySlice<Int>’ to type ‘[Int]’

前提:Array[0…2]で配列を3つスライスができます

エラーが発生したコード

intArray[4, 6, 1, 3, 9]         
var sliceArray = [Int]()
sliceArray = intArray[0...2]

エラーが発生しないコード1

intArray[4, 6, 1, 3, 9]         
let sliceArray = intArray[0...2]

エラーが発生しないコード2

intArray[4, 6, 1, 3, 9]         
let sliceArray = ArraySlice<Int>()
sliceArray = intArray[0...2]

要注意:Sliceされた配列は、Array<Int>ではなくArraySlice<Int>型になります

print(type(of: sliceArray))
//ArraySlice<Int>

“〇〇ViewController” from storyboard “Main”, but didn’t get a UITableView.

原因:

Swiftファイルを作成時UITableViewControllerを継承し、実装コードはUITableViewDelegateを継承前提に記載していた。

経緯:

SwiftファイルをXcodeで作成する時、UITableViewControllerクラスを継承して新規作成することができます。

TableView関連コードが既に記載されている形になるし、時短できると考えて、安易に継承したのですが、コード実装は

 〇〇ViewController: UIViewController, UITableViewDelegate{

を前提に記載していました。

UITableViewControllerを継承したSwiftファイルの中身見てみると TableView関連関数は Overrideで記載されていたり。
と、継承元が違うと書き方も違いますね。

Comment

メールアドレスが公開されることはありません。