Swiftの長所として私は配列等のメソッドチェーンやりやすさがあると感じます。
Objective-cと比べるとSwiftはメソッドが短いしブロックをシンプルに書けるのでメソッドチェーンが気持よく書けます。
["1", "2", "3", ""].flatMap { Int($0) }.filter { $0 < 2 }.map { $0 * 2 } // [2]
今回はブロックの省略方法をsortメソッドを例に書いていこうと思います。
通常の書き方
sortメソッドは省略せずに書くと以下のようになります。
let arr = [1, 2, 3]
arr.sort({ (value1: Int, value2: Int) -> Bool in
return value1 < value2
})
型の省略
型推論によって型を省略できます。
let arr = [1, 2, 3]
arr.sort({ (value1, value2) in
return value1 < value2
})
// sortメソッドの方に型情報が書いてあるので省略できる
// public func sort(@noescape isOrderedBefore: (Self.Generator.Element, Self.Generator.Element) -> Bool) -> [Self.Generator.Element]
()も省略できます。
let arr = [1, 2, 3]
arr.sort({ value1, value2 in
return value1 < value2
})
引数の省略
第一引数、第二引数は$0、$1に置き換える事ができます。
ブロック内が短い時はこの書き方をする事が多いです。
let arr = [1, 2, 3]
arr.sort({
return $0 < $1
})
returnの省略
ブロックの中身が1行の時はreturnも省略できます。
1行で処理を書く時に便利です。
let arr = [1, 2, 3]
arr.sort({ $0 < $1 })
最後の引数がブロックの時は{}を外に出すことができます。
let arr = [1, 2, 3]
arr.sort() { $0 < $1 }
ブロック以外の引数がない場合、()も省略できます。
let arr = [1, 2, 3]
arr.sort { $0 < $1 }
最初と比べるとすごいシンプルになりました。
let arr = [1, 2, 3]
arr.sort({ (value1: Int, value2: Int) -> Bool in
return value1 < value2
})
// ↓
arr.sort { $0 < $1 }
おまけ
sortは下の書き方もできます。
let arr = [1, 2, 3]
arr.sort(<)
< の実態は下のような関数なので、sortの引数として渡すことができます。
public func <(lhs: Int, rhs: Int) -> Bool