/Linq

Primary LanguageObjective-C

#Welcome Linq for Objective-C

Objective-CにLinqの各種メソッドを導入します。

各種メソッドはNSEnumeratorのカテゴリとして実装され、処理自体は.net Frameworkの場合と同様に遅延実行されます。

##Linq to Xml .net frameworkのXDocument等のLinq to XmlでのXmlツリー表現をまねた物を実装しました。Xmlに対してLinqを行う事が出来ます。 詳細はLinq to Xmlのドキュメントをご確認ください。

##メソッドチェイン記法 ブロックを返すプロパティでの実装を追加しました。いわゆるメソッドチェインでの記述が可能になります。 例)otherArrayに含まれないsomeArrayの要素でディレクトリを作成する。

    someArray.getEnumerator()
    .where(^BOOL(id item) {
        return !(otherArray.contains(item));
    }).forEach(^(id item) {
       [self makeDir:item];
    });

※本変更にともない幾つかのメソッド名が変更となる等破壊的な変更となっています。旧方式での実装も残してあるため#defineにて切り替えください。 USE_METHOD_CHAINを有効にする事でメソッドチェインバージョン。C#と記法が近くなる代わりにxCodeでの入力支援が有効に働かないようです。

##使用方法

NSEnumerator+Query.hをインポートして下さい。 NSEnumeratorに各種メソッドが追加されるので操作したいNSArrayやNSDictionaryからobjectEnumeratorによってNSEnumeratorを取得してから操作して下さい。

例)whereによって絞り込みを行う

NSEnumerator *list = [[someArray objectEnumerator]where^BOOL(id item) {
       return (true/* ここに条件を記載 */);}];

絞り込んだリストは列挙される際にフィルタ適用されます。(遅延実行)

toArrayやforEachといったメソッドで即時実行させる事も可能です。

例)otherArrayに含まれないsomeArrayの要素でディレクトリを作成する。

   [[[someArray objectEnumerator] where:^BOOL(id item) {
       return !([otherArray containsObject:item]);
   }] forEach:^(id item) {
       [self makeDir:item];
   }];

いくつかのメソッドはiOSに合う形に変更、追加してあります。 例)toMutableArray, fromNSDataなど。詳しくはドキュメントをご覧ください。

##実装済みメソッド ###生成系 range:(int)start to:(int)count;
repeat:(id)item count:(int)count;
empty;

##以下メソッドバージョン ###変換系 ofClass:(Class) class;
select:(id(^)(id)) selector;
selectWithIndex:(id(^)(id,int)) selector;
where:(BOOL(^)(id)) predicate;
whereWithIndex:(BOOL(^)(id,int)) predicate;
skip:(int) count;
skipWhile:(BOOL(^)(id)) predicate;
skipWhileWithIndex:(BOOL(^)(id,int)) predicate;
take:(int) count;
takeWhile:(BOOL(^)(id)) predicate;
takeWhileWithIndex:(BOOL(^)(id,int)) predicate;
scan:(id(^)(id,id))accumlator;
orderByDescription:(NSSortDescriptor *)firstObj, ... NS_REQUIRES_NIL_TERMINATION;
selectMany:(id(^)(id)) selector;
distinct;
concat:(NSEnumerator *)dst;
unions:(NSEnumerator *)dst;
intersect:(NSEnumerator *)dst;
except:(NSEnumerator *)dst;
buffer:(int)count;
toArray;
toMutableArray;
toDictionary:(id(^)(id)) keySelector;
toDictionary:(id(^)(id)) keySelector elementSelector:(id(^)(id)) elementSelector;
toMutableDictionary:(id(^)(id)) keySelector;
toMutableDictionary:(id(^)(id)) keySelector elementSelector:(id(^)(id)) elementSelector;
toData;
toString;

###要素取得系 elementAt:(int)index;
elementOrNilAt:(int)index;
single;
single:(BOOL(^)(id)) predicate;
singleOrNil;
singleOrNil:(BOOL(^)(id)) predicate;
first;
first:(BOOL(^)(id)) predicate;
firstOrNil;
firstOrNil:(BOOL(^)(id)) predicate;
last;
last:(BOOL(^)(id)) predicate;
lastOrNil;
lastOrNil:(BOOL(^)(id)) predicate;

###集計系 count;
all:(BOOL(^)(id)) predicate;
any:(BOOL(^)(id)) predicate;
contains:(id) item;
sequenceEqual:(NSEnumerator *)dst;

###処理関数系 forEach:(void(^)(id item)) action;

##シーケンス生成の追加カテゴリ ###NSData objectEnumerator
###NSString objectEnumerator

##以下メソッドチェインバージョン ###変換系 ofClass(Class classType);
select(id(^selector)(id item));
selectWithIndex(id(^selector)(id item,int index));
where(BOOL(^predicate)(id item));
whereWithIndex((BOOL(^predicate)(id item,int index));
skip(int count);
skipWhile(BOOL(^predicate)(id item));
skipWhileWithIndex(BOOL(^predicate)(id item,int index));
take(int count);
takeWhile(BOOL(^predicate)(id));
takeWhileWithIndex(BOOL(^predicate)(id item,int index));
scan(id(^accumlator)(id seed,id item));
orderByDescription(NSSortDescriptor *firstObj, ...);
selectMany(id(^selector)(id index));
distinct();
concat(NSEnumerator *dst);
unions(NSEnumerator *dst);
intersect(NSEnumerator *dst);
except(NSEnumerator *dst);
buffer(int count);
toArray();
toMutableArray();
toDictionary(id(^keySelector)(id item));
toDictionaryWithSelector(id(^keySelector)(id item), id(^elementSelector)(id item));
toMutableDictionary(id(^keySelector)(id item));
toMutableDictionaryWithSelector(id(^keySelector)(id), id(^elementSelector)(id item));
toData();
toString();

###要素取得系 elementAt(int index);
elementOrNilAt(int index);
single();
singleWithPredicate(BOOL(^predicate)(id item));
singleOrNil();
singleOrNilWithPredicate:(BOOL(^predicate)(id item));
first();
firstWithPredicate(BOOL(^predicate)(id item));
firstOrNil();
firstOrNilWithPredicate(BOOL(^predicate)(id item));
last();
lastWithPredicate(BOOL(^predicate)(id item));
lastOrNil();
lastOrNilWithPredicate(BOOL(^predicate)(id item));

###集計系 count();
all(BOOL(^predicate)(id));
any(BOOL(^predicate)(id));
contains(id item);
sequenceEqual(NSEnumerator *dst);

###処理関数系 forEach(void(^action)(id item));

##シーケンス生成の追加カテゴリ ###NSData getEnumerator();
###NSString getEnumerator();
###NSArray getEnumerator();
###NSDictionary getEnumerator();
getKeyEnumerator();

====