カテゴリーアーカイブ Swift

村上 著者:村上

【Swift】「Unexpectedly found nil while unwrapping an Optional value」エラーの対処法

最近、iOSアプリ開発に関する記事ばかりですが…今日も今日とて、アプリ開発中に遭遇したエラーについてです。

エラー文はこちら。

Unexpectedly found nil while unwrapping an Optional value

Google翻訳を使って翻訳したところ、「オプショナル値をアンラッピングしている間に予期せずnilが見つかりました」とのこと。
ある程度アプリ開発をしている人なら原因はすぐに分かるか、もしくはそもそもこのエラーが発生しないように対処済みかと思います。
が、Swift 初心者だと、オプショナル型が理解しづらく(実体験)、なかなかハマったのでまとめます。

 

今回参考にさせていただいたサイトはこちらから。

どこよりも分かりやすいSwiftの”?”と”!” – Qiita
https://qiita.com/maiki055/items/b24378a3707bd35a31a8

まずオプショナル型がイマイチわからない…という人は、この記事よりもこのリンクを読みましょう。

 

さて、対処方法ですが、まずエラーが発生したコードがこちら。

var title: Sting! // オプショナル型

/* 何らかの処理 */

print(title!);

簡単に説明すると、上記のコードの title という変数は、nil(null)を代入できるオプショナル型です。
非オプショナル型と違い、代入された値がラップ(包み紙)に包まれています。
これのおかげで、nil を扱うことができています。
で、この変数にタイトルのテキストを代入するなどの処理を行い、結果を print() で出力しています。
が、このとき、何らかの原因で、title変数に値が代入されないことがあります。
そして、中身が nil の状態で、包み紙を剥がすアンラップの処理を行うと、エラーが発生します。
このエラーが、今回紹介した「Unexpectedly found nil while unwrapping an Optional value」です。

これを解決するために、アンラップの処理を下記のように変更します。

// 変更前
// print(title!);

// 変更後
if let unwrap_title = title {
    print(unwrap_title)
}
else {
    print("値が代入されていません")
}

なお、この方法を「オプショナルバインディング」と言います。

簡単に解説すると、新しいコードでは、まずオプショナル型の変数を if 文以降の定数に代入しています。
その結果が nil でなかれば、if 以下の処理が実行されます。
一方で、title を代入した定数が nil であれば、else 以下の処理が実行されます。
なお、title の値は unwrap_title に代入されていますので、こちらを利用します。
処理としては以上です。

 

最初に紹介したアンラップ方法は、「強制的アンラップ」といい、文字通り代入された値に関係なくアンラップの処理を行います。
この方法は、絶対に nil が代入されない変数に対してのみ使うようにしてください。
そうでなければ、オプショナルバインディングを使うことを強く推奨します。

私も最初はオプショナル型が全く理解できず、かなり苦労しました。
個人的には、実際にコードを書いてみて、どういうときにプログラムが落ちるのかを体験するとわかりやすいかなと思います。

  • この記事いいね! (0)
村上 著者:村上

【Xcode】Type ‘UISlider’ does not conform to protocol ‘ValidatableInterfaceElement’エラーへの対処法

久しぶりに遭遇したXcodeでのエラーです。
特に内容を変更した記憶のないアプリを開いてみたら、いきなりビルドエラーが発生しました。
エラー分は下記のとおりです。

Type 'UISlider' does not conform to protocol 'ValidatableInterfaceElement'

どうやら、CocoaPodでインストールした「Validator」というライブラリ内部でエラーが発生していたことまでは突き止めたのですが、その原因がわからず…検索してもヒットしない状況でした。
なお、Validator についてはこちらから。

GitHub – adamwaite/Validator
https://github.com/adamwaite/Validator

が、会社にあるもう一台のMacbookでは問題なく動いていたので、そこが謎でした。

 

で、色々見てみた結果、どうやらXCodeのバージョンが影響していたことが判明!
先日、Xcode をアップデートして 9.3 にしたのですが、これを 9.2 に戻したら問題なく動き、ビルドも完了しました。
……Xcodeは不用意にアップデートしてはだめですね…。

なお、Xcodeの以前のバージョンをインストールする方法は、下記の記事を参考にしました。

Xcodeの旧バージョンをインストールする方法 – Qiita
https://qiita.com/TsukasaHasegawa/items/0d7d5c2cf3a2b8ce8993

ただ、ダウンロードに凄く時間がかかったので、何か別の作業をしながらのんびり待つことをおすすめします。
ダウンロード時間が「残り約60分」の表示を見た時は、正直ため息を付きそうになりました…。

 

ということで、ビルドエラーの解消方法でした。
同僚に聞いたところ、Xcode のバージョンの違いのせいで発生するバグってあるようなので、バグの原因が分からないときに確認するようにしましょう。

  • この記事いいね! (0)
村上 著者:村上

【未解決】Xcode 9.1 で ‘Cordova/CDVViewController.h’ file not found というエラーが発生

Cordova で開発中のアプリをビルドしようとしたところ、下記のようなエラーが発生しました。

MainViewController.h:28:9: ‘Cordova/CDVViewController.h’ file not found

エラー内容は書いてある通りで、MainViewController.h というファイルで、Cordova/CDVViewController.h が見つからないというものでした。
MainViewController.h を確認してみると、確かに #import <Cordova/CDVViewController.h> の行でエラーとなっていました。

 

解決方法を調べたところ、下記の画像のように、Build SettingsHeader Search Path の値に下記のような記述があるので、

"$(OBJROOT)/UninstalledProducts/include"

こちらを、

"$(OBJROOT)/UninstalledProducts/$(PLATFORM_NAME)/include"

上記に変更すれば、実行できますとの書き込みを見つけたので、早速試してみました。

が、今回のエラーはこちらでは解決できませんでした…!
以前も全く同じエラーに遭遇したことがあり、その時はこのやり方で解決できたのですが、今回は何故かダメでした。
他にも、iOSのプラットフォームを一度削除した後、再度追加するとビルドできるとの記載もあったのですが、こちらも効果なし…。
それ以外の解決方法も検索してはいるのですが、ほぼ Build Settings > Header Search Path の値を修正するという解決策しかヒットしないので、正直手詰まりです。

もし、上記以外の解決策をご存知の方は、是非ともご教授くださいませ。
どうぞよろしくお願い致します。

  • この記事いいね! (4)