🙆

【DAY14】100 Days of SwiftUI -optionals, nil coalescing

2023/01/13に公開

はじめに

iOSアプリ界隈で(たぶん)有名なPaul Hudsonさんが無料で公開しているSwiftUIの100日学習コースを進めてみます。学習記録及び備忘録がてらにつらつらと書いてみます。
100 Days of SwiftUI

学んだこと

オプショナル、オプショナルアンラップ、nil結合

オプショナル

Zev Eisenbergは言う「Swiftはオプショナルを導入したのではない。非オプショナルを導入したのだ。」

Zev Eisenberg said, “Swift didn’t introduce optionals. It introduced non-optionals.”

nil(一般的な言語でいうnull)が入りうる変数の型はオプショナル型となる。Swiftでは「?」を用いて厳密に区別している。StringのオプショナルはString?となる。オプショナルを通常の型と区別せずに扱っているとビルドできない。
以下のコードを例にすると、関数定義の引数は通常のIntだが、呼び出し側の引数がオプショナルのInt?であるためエラーになる。

func square(number: Int) -> Int {
    number * number
}

var number: Int? = nil
print(square(number: number))

オプショナルアンラップ

Swiftではオプショナルを扱うときは以下のようにアンラップを噛ませるのが一般的である。変数は同じ名前にするのが一般的とのこと。必要に応じてelseをつける。

func square(number: Int) -> Int {
    number * number
}

var number: Int? = nil
if let number = number { // nilでない場合はここで通常のInt型になる(型推論される)
    print(square(number: number))
}

オプショナルをアンラップする別の方法にguard letがある。用途としてはif letと同じだが、guard letは条件に反する場合の処理を記載する。以下にコード例を示す。

var myVar: Int? = 3

if let unwrapped = myVar {
    print("Run if myVar has a value inside")
}

guard let unwrapped = myVar else {
    print("Run if myVar doesn't have a value inside")
}
// 実際にはguard letでエラーが発生する。

if letがnilでないときの処理を中に記載しているのに対し、guard letはnilであるときの処理を記載している。
guard letは条件が正しいかどうかを前もって確認するようなときに可読性が高い。よくあるif letとguard letの使い分けは

  • 単にオプショナルをアンラップする場合 -> if let
  • 条件が正しいかどうかをチェックして処理を続けたい場合 -> guard let

#nil結合
nil結合演算子??を利用してアンラップすることも可能。

struct Book {
    let title: String
    let author: String?
}

let book = Book(title: "Beowulf", author: nil)
let author = book.author ?? "Anonymous"
print(author)

#オプショナルチェーン
もしXXがオプショナルでなければXX...といった処理を書く方法。
「もし本があって、その本に著者がいて、著者に頭文字があれば、それを大文字にして送り返す、そうでなければAを送り返す」という処理の場合は以下のようになる。

struct Book {
    let title: String
    let author: String?
}

var book: Book? = nil
let  author = book?.author?.first?.uppercased() ?? "A"
print(author)

Discussion