↑クリックして拡大
↑クリックして拡大
↑クリックして拡大
↑クリックして拡大

頭痛が減ったので共有です!

rebuild.fmを応援しています!

HOME > unexpectedly found nil while unwrapping an Optional value

unexpectedly found nil while unwrapping an Optional valueの対応

よく発生するがいまいちわかっていないOptional型のエラーの解説です。

この英語、直訳すれば Optional型の値をアンラップした時に予期せぬnilを見つけましたとなります。Unwrapする方法は覚えておられるでしょうか?びっくりマークをつけることでアンラップします。

Optional型の以前の記事はこちらから ー>クエスチョンマークとビックリマーク

やってみた

まずこのエラーを再現させてみます。


//テスト用のクラスを作成
class SwiftSalaryMan {
    func sayRequestToCompany() -> String {
        return "週休五日制希望"
    }
}

//Optional型でSwiftSalaryManを宣言
var wrappedSwiftSalaryMan: SwiftSalaryMan? = SwiftSalaryMan()

//nilを入れてForcedUnwrapして実行
wrappedSwiftSalaryMan = nil;
println(wrappedSwiftSalaryMan!.sayRequestToCompany());
->結果(ランタイムエラー:fatal error: unexpectedly found nil while unwrapping an Optional valueが表示)
        

Optional型で宣言したクラスにnilを入れて実行させた場合に発生しました。

Swift言語的には実施して欲しくなクラッシュする手順。 ただ、なんとなくしっくりきません。Optional型にしたりラップしたり、アンラップしたり、、、意味がこんがらがります。。。Unwrapする方法によってエラーが違ってくるので混乱している気がしますので、nilを入れなかった場合や、!をつけない、?をつけてみるの方法で結果を表示してみます

Optional型のwrappedSwiftSalaryMan?に「nilを入れない」でテスト


var wrappedSwiftSalaryMan: SwiftSalaryMan? = SwiftSalaryMan()
//wrappedSwiftSalaryMan = nil;
       
//①何もつけない
println(wrappedSwiftSalaryMan.sayRequestToCompany());
->結果(コンパイル失敗:エラーでCompiler error: 'SwiftSalaryMan?' does not have a member named 'sayRequestToCompany')

//②びっくりマークをつける
println(wrappedSwiftSalaryMan!.sayRequestToCompany());
->結果(実行成功:String型で週休五日制希望をログ出力)

//③クエスチョンマークをつける
println(wrappedSwiftSalaryMan?.sayRequestToCompany());
->結果(実行成功:OptionalのString型で週休五日制希望をログ出力)
        

Optional型のwrappedSwiftSalaryMan?に「nilを入れて」テスト


var wrappedSwiftSalaryMan: SwiftSalaryMan? = SwiftSalaryMan()
wrappedSwiftSalaryMan = nil;
       
//①何もつけない
println(wrappedSwiftSalaryMan.sayRequestToCompany());
->結果(コンパイル失敗:エラーでCompiler error: 'SwiftSalaryMan?' does not have a member named 'sayRequestToCompany')

//②びっくりマークをつける
println(wrappedSwiftSalaryMan!.sayRequestToCompany());
->結果(ランタイムエラー:この記事のエラー<unexpectedly found nil while unwrapping an Optional value>)

//③クエスチョンマークをつける
println(wrappedSwiftSalaryMan?.sayRequestToCompany());
->結果(実行成功:nilをログ出力)
        

デフォルトのwrappedSwiftSalaryManに「nilを入れない」でテスト(Optional型にしない)


var wrappedSwiftSalaryMan: SwiftSalaryMan = SwiftSalaryMan()
       
//①何もつけない
println(wrappedSwiftSalaryMan.sayRequestToCompany());
->結果(実行成功:String型で週休五日制希望をログ出力)

//②びっくりマークをつける
println(wrappedSwiftSalaryMan!.sayRequestToCompany());
->結果(コンパイルエラー:Operant of postfix '!' should have optional type)

//③クエスチョンマークをつける
println(wrappedSwiftSalaryMan?.sayRequestToCompany());
->結果(コンパイルエラー:Operant of postfix '?' should have optional type)
        

デフォルトのwrappedSwiftSalaryManに「nilをいれて」テスト(Optional型にしない)


var wrappedSwiftSalaryMan: SwiftSalaryMan = SwiftSalaryMan()
wrappedSwiftSalaryMan = nil;
->結果(コンパイルエラー:does not conform to protocol 'NilLiteralConvertible')
        

まとめ

いろいろ書いてOptional型の説明のようになってしまいました、、、、説明のつもりが逆にややこしくなっているかもしれません。

つまりクエスチョンマークをつけた場合はOptional型のままでアクセス、 びっくりマークの場合はアンラップした状態でアクセス、と「Optional型のクラスはメンバ変数や関数へのアクセスする選択肢が2つ存在する」が混乱する理由なのではと思いました。

すこしでも何か理解のきっかけになれば幸いです

↓こんな記事もありますよ!


2021-05-14 14:21:41

WatchOSのwatchconnectivityのFiletransferの落とし穴。と、避け方。

AppleWatch 実機だと成功するんだけど、シュミレーターだと失敗するという、、、 昔作成してた時は成功してたのになーと思って調べると、どうやら昔は成功してたみたい。watchOS6以降は...

2021-05-06 14:04:37

LINEのアニメーションスタンプ制作の落とし穴、、、失敗談

ゴールデンウィークにLINEスタンプを作成してみました。 作り切って申請も通したんですが、意図したアニメーションと違う、、、、 LINEクリエーターの画面だと、アニメーションのプレビュー...

2021-05-01 18:05:35

久しぶりのAdmobをobjective-cに実装。コンパイルエラーだらけ。バーミッション不具合でエミュレータにインスコできない。

忘れないようにメモ エミュレータにアプリをインストールする際にパーミッション系のエラーがでた時、また、iphone実機にインストールする際にも権限系のエラーが出る場合。 ターゲット→ex...
このエントリーをはてなブックマークに追加
右側のFacebookのLikeをクリック頂けると記事更新の際に通知されますので宜しければご利用下さい!