動機
Realmに触っていたときに、前から好きで使ってたBlocksKit のメソッドが使えなかったのでBlocksKitを参考にして拡張してみました。
最低限のメソッドしか実装してないですがあしからず
ゴール
RLMResults *result = [RLMObject objectsWhere:@"id < 10"];
[results bk_map:^id(id obj){ block }];
のように使いたい。
拡張 (RLMResults+Block.m)
- (void)rlm_each:(void (^)(id obj))block;
{
NSParameterAssert(block != nil);
for (id obj in self) {
block(obj);
}
}
- (void)rlm_eachWithIndex:(void (^)(id obj, int idx))block
{
NSParameterAssert(block != nil);
int index = 0;
for (id obj in self) {
block(obj, index);
index++;
}
}
- (id)rlm_match:(BOOL (^)(id obj))block;
{
NSParameterAssert(block != nil);
for (id obj in self) {
if (block(obj)) {
return obj;
break;
}
}
// not match
return nil;
}
- (NSArray *)rlm_map:(id (^)(id obj))block
{
NSParameterAssert(block != nil);
NSMutableArray *result = [NSMutableArray array];
for (id it in self) {
id value = block(it) ?: [NSNull null];
[result addObject:value];
}
return result;
}
拡張 (RLMArray+Block.m)
- (void)rlm_each:(void (^)(id obj))block
{
NSParameterAssert(block != nil);
for (id obj in self) {
block(obj);
}
}
- (void)rlm_eachWithIndex:(void (^)(id obj, int idx))block
{
NSParameterAssert(block != nil);
int index = 0;
for (id obj in self) {
block(obj, index);
index++;
}
}
- (id)rlm_match:(BOOL (^)(id obj))block
{
NSParameterAssert(block != nil);
for (id obj in self) {
if (block(obj)) {
return obj;
break;
}
}
// not match
return nil;
}
- (NSArray *)rlm_map:(id (^)(id obj))block
{
NSParameterAssert(block != nil);
NSMutableArray *result = [NSMutableArray array];
for (id obj in self) {
id value = block(obj) ?: [NSNull null];
[result addObject:value];
}
return result;
}