ボクココ

個人開発に関するテックブログ

Swift の型と省略記法を学ぶ

ども、@kimihom です。

f:id:cevid_cpp:20210124175657j:plain

まだ Swift を学習中の状態だ。Swift で実際に書かれたコードを読むと、「!?なんだこの書き方は」っていう謎の文法のソースコードをよく見る。そこをスルーせず、ちゃんと理解することで、心地よく Swift コードを読むことができよう。

型の中でも、特徴的なのが Optional型 だ。値が"ある"か, "nil" かいずれかを表す型である。 実際に存在する場合の Optional型にアクセスするには、事前に検証するコードが必要となる。 検証方法1では if 文で代入して確認する方法。検証方法2では各 opt の書き方で nil の場合には ?? の右の値が使われることになる。検証方法3ではメソッド内の検証で通れば出力させる。

let opt1 = Optional.some(5)
let opt2: Int? = nil
let opt3 = Optional(5)

// 検証方法1
if let opt = opt1 { 
  print("opt1 is /(opt1)") // opt1 is 5
}
// 検証方法2
print("opt1=\(opt1 ?? 0), opt2=\(opt2 ?? 0), opt3=\(opt3 ?? 0)") // opt1=5, opt2=0, opt3=5

// 検証方法3
func test() {
  guard let optg = opt1 else {
    return
  }
  print("opt1 is \(optg)") // opt1 is 5
}
test()

省略記法

関数でクロージャを返す場合の書き方がいくつかある。Swift のコードを見ると、ほとんどが3つめの最も省略されたケースを使うことが多い。これは、引数がクロージャのみである場合にのみ利用できる。

func execute(handler: (String) -> Void) {
    handler("called")
}
execute(handler: { string in
    print("1 \(string)")  // 1 called
})
execute() { string in
    print("2 \(string)")  // 2 called
}
execute { string in // 引数が1つのクロージャのみの場合
    print("3 \(string)")  // 3 called
}


// クロージャ関数定義しない場合 $0 は map クロージャに渡ってくる1番目変数
[1,2,3].map { $0 * 2 }
[4,5,6].map { $0 * 2 }

// クロージャ関数: $0 * 2 を一つにまとめられる
// double と 命名できる
func double(_ x: Int) -> Int {  // double(3) => 6
  return x * 2
}
[1,2,3].map(double)
[4,5,6].map(double)

終わりに

Swift の基本的なところではあるが、特徴的な書き方をするものをピックアップして記事とした。

これらの記法は見るだけではパッと理解できないけど、理解すれば自分でもシンプルな書き方を率先して使うことになると思う。

以下の本を読んで Swift の言語に関して一通り理解できた。その他にプロトコルとジェネリクスが関門となるだろうが、他の言語を学んだ経験があったので概要を理解できた。 混乱したらまた読んで理解しよう。