PIYO - Tech & Life -

SwiftのUnderscore.js風ライブラリ見つけた

Objective-C Swift

前にObjective-C向けのを見つけてこんなのを書いた。

Underscore.js風Objective-Cライブラリ「_.m」 - ぴよログ

Swiftにも早速似たようなのが出てきたようだ。

Dollar.$wift by ankurp

サンプルで比較

例としてfindのサンプルを。

Swift

$.find([1, 2, 3, 4, 5, 6], iterator: { $0 == 2 })
=> 2

Objective-C

N* even = _.find(AI(1, 2, 3, 4, 5, 6), ^B(N* num){ return num.I % 2 == 0; });
=> 2

Objective-CのほうはAIとかいうマクロで配列を表現したり、ブロックの部分が書きにくかったりするので少々複雑に見える。Swiftのほうがやはりシンプルに書けるようだ。

実装を比較

findの実装も見比べてみる。

Swift

class func find<T: Equatable>(array: T[], iterator: (T) -> Bool) -> T? {
    for elem in array {
        let result = iterator(elem)
        if result {
            return elem
        }
    }
    return nil
}

Objective-C

+ (id(^)(id list, _FindBlock iterator))find
{
  return ^(id list, _FindBlock iterator) {
    __block id result;
    _.any(list, ^B(id value, ... /* KEY, LIST */) {
      if (iterator(value)) {
        result = value;
        return true;
      }
      return false;
    });
    return result;
  };
}

Objective-Cつらい。