学生かえるエンジニアのブログ

iOSを主にやる勉強中エンジニア。かえるが好き。ピクルスってかわいいよね。

Swiftの言葉・名称の理解 (if-let 構文など「Optional〇〇」)

独学で学んでいると、

「書けるけど名称がわからない」

「だから困ったときに検索しづらい」

「エンジニアとの会話で言いたいことが言えない・相手の発言が理解できない」

こんなことがよくあります。言葉を理解しようということで、Optional系の言葉をまとめてみました。

Forced Unwrapping フォーストアンラッピング

var str: String?
print(str!)

上記のように!をつけてオプショナル型を強制的に非オプショナル型にします。

もしstrnilだった時落ちてしまうため、いかなるときもあまり推奨されません。

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となります。

これにより、fruitnilか否かを事前に判定する必要などもなく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

後記

間違いや追加情報などありましたらコメントお願いします!

感想やご意見などもぜひぜひ!