
前にObjective-C向けのを見つけてこんなのを書いた。
Underscore.js風Objective-Cライブラリ「_.m」 - ぴよログ
Swiftにも早速似たようなのが出てきたようだ。
サンプルで比較
例としてfindのサンプルを。
Swift
1$.find([1, 2, 3, 4, 5, 6], iterator: { $0 == 2 })
2=> 2
Objective-C
1N* even = _.find(AI(1, 2, 3, 4, 5, 6), ^B(N* num){ return num.I % 2 == 0; });
2=> 2
Objective-CのほうはAIとかいうマクロで配列を表現したり、ブロックの部分が書きにくかったりするので少々複雑に見える。Swiftのほうがやはりシンプルに書けるようだ。
実装を比較
findの実装も見比べてみる。
Swift
1class func find<T: Equatable>(array: T[], iterator: (T) -> Bool) -> T? {
2 for elem in array {
3 let result = iterator(elem)
4 if result {
5 return elem
6 }
7 }
8 return nil
9}
Objective-C
1+ (id(^)(id list, _FindBlock iterator))find
2{
3 return ^(id list, _FindBlock iterator) {
4 __block id result;
5 _.any(list, ^B(id value, ... /* KEY, LIST */) {
6 if (iterator(value)) {
7 result = value;
8 return true;
9 }
10 return false;
11 });
12 return result;
13 };
14}
Objective-Cつらい。