Swiftの言葉・名称の理解 (if-let 構文など「Optional〇〇」)
独学で学んでいると、
「書けるけど名称がわからない」
「だから困ったときに検索しづらい」
「エンジニアとの会話で言いたいことが言えない・相手の発言が理解できない」
こんなことがよくあります。言葉を理解しようということで、Optional系の言葉をまとめてみました。
Forced Unwrapping フォーストアンラッピング
var str: String? print(str!)
上記のように!
をつけてオプショナル型を強制的に非オプショナル型にします。
もしstr
がnilだった時落ちてしまうため、いかなるときもあまり推奨されません。
Nil Coalescing Operator ニルコアレーシングオペレーター
var str: String? let unwrapStr = str ?? ""
[1.オプショナルな値] ?? [2.左と同じ型で非オプショナルな値]
こう書くことで、
もし1がnilの時は2が、もし1がnilで無い時は1が返り、かつ非オプショナル型で返ります。
上記の例でいくとunwrapStr
は非オプショナルな通常のString型であり、safetyなコードとなります。
if文や三項演算子でnil判定などすると可読性が失われたりコードが冗長になるので、この書き方はスマートで好きです。
Optional Binding オプショナルバインディング
var str: String? if let unwrapStr = str { print(unwrapStr) // unwrapStrはオプショナルではない } // この場所でunwrapStrは使えない
str!
などするのは、例えnilで無いことが確実であっても少し嫌。そんなときに書く出番も多いこの書き方ですね。
単純に if-let 構文 といったりもするようです。
guard-let 構文 (guard との併用 )
この書き方も多いです。この書き方はインデントが深くならない所が魅力的です。
この記事は名称把握のためであって技術的解説が目的ではないので細かくは割愛します。
guard let unwrapStr = str else { // strがnilの時 (この場所でunwrapStrは使えない) return } // この場所でのunwrapStrは非オプショナル型
Shadowing シャドーイング
これは同じ名前の変数を宣言する的な事でしょう。
例えば関数の引数をいじりたい時、直接はいじれないので同名の変数を宣言してから扱います。
func foo(i: Int) { var i = i } // func foo(var i: Int) という書き方はswift3から出来なくなりました。
先程の Optional Binding の時にもつかえて、下記の様に使います。
この書き方のほうが頻出でしょうね。
var str: String? if let str = str { print(str) // この場所でのstrは非オプショナル } // この場所でのstrはオプショナル
Optional Chaining オプショナルチェーニング
class Fruit { var name: String func cook() -> String } var fruit: Fruit? let fruiteName = fruit?.name // fruit がnilの場合、fruiteName は nil // そうでない場合、通常の値がオプショナル型で返る let food = fruit?.cook() // fruit がnilの場合、cook関数は実行されず、foodはnil // そうでない場合、cook関数は実行され、通常の値がオプショナル型で返る
上記のように、オプショナルのプロパティやメソッドを、?
で繋ぐことでOptionalChainingとなります。
これにより、fruit
がnilか否かを事前に判定する必要などもなくsafetyにコードを書くことが出来ます。
ただ、返る値がオプショナルになります。
参考
どこよりも分かりやすいSwiftの"?"と"!" - Qiita
【Swift】オプショナルバインディングでネストを避ける - Qiita
var a = a や if let b = b {} のような紛らわしい構文も使えるswiftのシャドウイング - Qiita
swift-evolution/0003-remove-var-parameters.md at master · apple/swift-evolution · GitHub
【Swift】Optional型を安全にunwrapしよう - Qiita
後記
間違いや追加情報などありましたらコメントお願いします!
感想やご意見などもぜひぜひ!