プログラマメモ2 - programmer no memo2

enumerateObjectsUsingBlockの練習 2010/07/04

Objective-Cです。
enumerateObjectsUsingBlockを使ってみます。
Objective-CってC + Smalltalkと考えれば、何となくこの文法ってありなんだなーと。

Smalltalkってかなり昔からあるというのは知っています。
といいつつもSmalltalkのことわかってません....
※^これがでてくるところとか...
なじみがないので、混乱してしまいますが、温故知新ですかね。

#import <Foundation/NSArray.h>
#import <Foundation/NSObject.h>
#import <Foundation/NSString.h>
#import <Foundation/NSAutoreleasePool.h>

// NSMutableArrayだよ!!
static NSMutableArray* array;
@interface MyData : NSObject {
NSString* name;
}
@property (nonatomic, retain) NSString* name;
@end

@implementation MyData
@synthesize name;
@end

int main(){

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];


{
// データつくる

array = [[NSMutableArray alloc] init];
int i = 0;
for (i=0; i<5; i++) {
MyData* mydata = [[MyData alloc]init];
mydata.name = [NSString stringWithFormat:@"aaaa%d",i];
[array addObject:mydata];
}
}


{// その場で定義してその場で使うパターン
// ここでenumerate
// enumerateObjectsUsingBlock:(void (^)(id obj, NSUInteger idx, BOOL *stop))
// 中身の確認
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"==>%@", [obj name]);
}];

}


// BLOCKで使ってソート!!
[array sortUsingComparator:^(id obj1, id obj2) {
NSLog(@"[%@]と[%@]を比較", [obj1 name], [obj2 name]);
return [[obj2 name] compare:[obj1 name]];
}];

{// 宣言したものを後から使うパターン
id enumerator = ^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"enumerator ==>%@", [obj name]);
};

[array enumerateObjectsUsingBlock:enumerator];
}

[pool drain];
return 0;
}


とりあえず参考
Smalltalk Blocks And Closures

: