読者です 読者をやめる 読者になる 読者になる

Objective-Cのblocksの使い方

基本的な使い方

返り値無し・引数無しのblocks
void (^blocksName)() = ^{
    NSLog(@"blocks");
};
blocksName(); // "blocks"と出力される
返り値無し・引数有りのblocks
void(^blocksName)(NSString *) = ^(NSString *string) {
    NSLog(@"%@", string);
};
blocksName(@"blocks!!!!!"); // 引数の内容が出力される
返り値有り・引数有りのblocks
NSString *(^blocksName)(NSString *) = ^NSString *(NSString *string) {
    NSLog(@"%@", string);
    return [string uppercaseString];
};
NSString *ret = blocksName(@"blocks"); // 引数の内容が出力される
NSLog(@"%@", ret); // BLOCKS と出力される
引数複数もいける
void(^blocksName)(NSString *, NSString *) = ^(NSString *string1, NSString *string2) {
    NSLog(@"%@, %@", string1, string2);
};
blocksName(@"foo", @"bar");

引数・返り値は当然NSString以外も使えます

関数の引数として使う

blocksの型を宣言して使う
typedef void(^BlocksType)(); // 引数・返り値なしのblocksをBlocksTypeという型名でdefine

- (void)foo:(BlocksType)blocks {
    blocks();
}

- (void)bar {
    // fooメソッドの中でblocksが実行されて、"blocks"と出力される
    [self foo:^{
        NSLog(@"blocks");
    }];
}

少し分かりにくくなるから、publicなメソッドでは使いたくないけど、blocksをそのまま渡すことも出来る。

- (void)foo:(void (^)())blocksName {
    blocksName();
}

- (void)bar {
    // fooメソッドの中でblocksが実行されて、"blocks"と出力される
    [self foo:^{
        NSLog(@"blocks");
    }];
}


参考
C/Objective-C + Blocks でクロージャ - TrashSUITE