Swift転職なら=>【LevTech】
↑クリックして拡大
↑クリックして拡大
↑クリックして拡大
↑クリックして拡大

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

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

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の対応

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

GはGoogle他のアルファベットを勝手に妄想してみる

さて昨日はGoogleが衝撃的な発表でAlphabetという親会社をつくって、Googleはアルファベットの中のGがGoogleとの 位置づけで今後展開していくとの事。ネーミングもですが、今後の期待を大きく感じる、またわかりやすく好印象だったのか株価も 大きく上がったとのことでした。さて、その他残りのアルファベットはどんな風になるのかなぁと勝手に歩きながら妄想してみました。

大阪都構想の橋下さんの鼻に誠意をもって顔認識処理で画鋲を刺す

先日大阪都構想でニュースがざわついておりましたが、 そこで自分が思っていたこと、なぜ鼻ピンしたのかを顔認識サンプルと誠意を込めて書き記してまいります。(※選挙ポスターに画鋲を刺す事や、そもそも「他人様」の画像を変更することがタブーな事を理解しつつの投稿です。問題がないかの問い合わせメールを送る予定です。画像はWikipediaからの引用です)

UIFontのフォント一覧をWebViewで表示させてそれをキャプチャ保存する

文字フォントがわかっても実際の文字がわかりませんので、 WebViewに出力させて、その結果を端末のPhotoアルバムに保存させる処理をつくってみました
このエントリーをはてなブックマークに追加
右側のFacebookのLikeをクリック頂けると記事更新の際に通知されますので宜しければご利用下さい!