enumerateObjectsUsingBlockの練習
2010/07/04
objective-c
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;
}
#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
: