HOME > クエスチョンマークとビックリマーク
クエスチョンマークとビックリマーク
Swiftを開発するようになって頻繁に目にする変数宣言時のクエスチョンマークやビックリマークの意味がわからなかったので調査します。こちらオプショナル型(optional value)との名称があるようです。
参考: Swiftことはじめ:String?のクエスチョンマークって何?
参考: 【Swift入門】Optional型 (?, !) をまとめてみた
参考: Swift ( beta7 )での設計方針について 〜 Optionalとの付き合い方 〜 [追記あり]
参考: どこよりも分かりやすいSwiftの"?"と"!" <ー★オススメ!
'?'のクエスチョンマーク
以下の違いはわかりますでしょうか?
//片方だけクエスチョンマーク付き
var test1 = "hogehoge";
var test2? = "hogehoge";
こちら、どうやら?をつけないとnilが代入できないようです。(nilは標準では追加不可になり厳格になった)
var test1 = "hogehoge";
test1 = nil;//エラー!!!
var test2? = "hogehoge";
test2 = nil;//問題なし
'!'のビックリマーク
さて、では吃驚マークはどう扱うのでしょうか?これは?マークの付随品みたいなものです。?があってこその記号だと覚えてください。 以下のコードはどう処理されると思いますか?
//クエスチョン付きInt型
var questionInt:Int? = 123;
//Intを引数にもつ関数
func test(value:Int){
println(value);
}
test(questionInt);
こちらですが、コンパイルエラーとなります。Int!型にIntを入れたので
test(questionInt);
この箇所がクエスチョンマークがついているエラーになります。これをどうにかして処理させたい時に以下のように記載します。
test(questionInt!);
するとエラーなく処理されます。
以下の様に省略しないで記載することも可能です。同じ意味です。
//省略タイプ
var questionInt:Int? = 123;
//通常タイプ
var questionInt:Optional<Int> = 123;
注意(2014/12/17追記)
Optional型の省略形とアンラップの !, ? は別物なので注意です。少しややこしいですが、Optional型の宣言には?と!の2種類どちらも利用できます。?は上述の通りですが、!は少し挙動が違います、以下のコードをご確認ください。
(?) = Optional型
//(?)Optional省略タイプ
var optionalInt:Int? = 123;
var optionalInt:Optional<Int> = 123;と同じ
var nilobj = nil;
optionalInt = nilobj! //(!)をつけてUnwrapしないとエラー
(!) = Implicitly Unwrapped Optional型
//(!)Implicitly Unwrapped Optional省略タイプ
var optionalInt:Int! = 123;
var unwrappedOptionalInt:ImplicitlyUnwrappedOptional<Int> = 123;と同じ
var nilobj = nil;
unwrappedOptionalInt = nilobj //(!)をつけなくてもOK!自動でUnwrap
まとめ
どうやらこの複雑に見える宣言方法ですが、nilによるエラーを極力下げる為のようです。たしかにobjective-cではnil関連で何度もクラッシュしていましたので、、、、、、、コンパイル時にnilが使われていないことを標準の変数で明確にさせるための策のようで、その他言語でも採用されてきているnull対策のようでした。
忘れやすいので、私はこう覚えています
??????????変数??????????? - ?で変数をラッピング。
これでnil厳格なコンパイル君には気づかれない
??????????変数+nil??????????? コンパイル君(見てるけど、?で見えない)
!の通行手形をもっている変数だけは?を通過できる。!の他の用途もあるので一概には言えませんが、、、
追記(2015/01/25)
unexpectedly found nil while unwrapping an Optional value(Optional型の値をアンラップした時に予期せぬnilを見つけました)のエラーに対応する記事を以下に追加しました。
よろしければ合わせてご一読くださいませ
unexpectedly found nil while unwrapping an Optional valueの対応
↓こんな記事もありますよ!
![]() | Facebook SDK のAppEventを検証するさて、AppEventですが、FacebookのAppを利用したログシステムなのかな。ログをカスタマイズして保存して、 それを解析できる、そんな感じなのかなと思っています。 広告利用の為に、インストールされた数やログの解析によってユーザの動作を確認できるようですので細かく設定できるのではと思います。 まずは上記のようにログを保存する、ログを読み込む、ができるのかを検証してみます |
![]() | カスタムクラスを作成時いつも忘れる。継承クラス作成時のメモカスタムクラスを作成する時いつもUIViewを継承する際のrequired Initの箇所でハマってしまうので覚書です。 |
![]() | 外部ブラウザでURLを開くアプリから外部ブラウザ(Safari)でURLを開く方法を記載します。内部的に利用する場合はWebViewを利用します。 |
Tweet
![]() |
|||
|