Objective-C class 定義一個物件(object),該物件含有資料和一些行為。有時可能只是些簡單的任務或行為單元,而不是一個方法。類似於Swift closure
。
此時可以使用 Blocks,它可以創建不同的 code 片段,這些片段像值(value)一樣傳給方法。
Blocks 是 Objective-C objects,這意味著它們可以被加到像 NSArray 或 NSDictionary 中。
returntype (^blockName)(argumentType);
returntype (^blockName)(argumentType)= ^{
};
ex.
void (^simpleBlock)(void) = ^{
NSLog(@"This is a block");
};
調用
simpleBlock();
這是一個簡單的範例,用來實現和調用帶有參數與返回值的 block
int (^add) (int, int) = ^ (int num1, int num2){
return num1 + num2;
};
int addValue = add(2,4);
NSLog(@"addValue值為:%d",addValue);
有點類似Swift @escaping
的概念,以下有個簡單範例:
#import <Foundation/Foundation.h>
// Block
typedef void (^CompletionBlock)();
@interface SampleClass : NSObject
- (void)actionWithCompletion:(CompletionBlock)completionBlock;
@end
@implementation SampleClass
- (void)actionWithCompletion:(CompletionBlock)completionBlock {
NSLog(@"123123");
completionBlock();
}
@end
int main () {
SampleClass *sampleClass = [[SampleClass alloc] init];
[sampleClass actionWithCompletion:^{
NSLog(@"測試成功");
}];
return 0;
}
結果:
2021-09-25 01:30:12.513299+0800 TestOC[42625:1157919] 123123
2021-09-25 01:30:12.513847+0800 TestOC[42625:1157919] 測試成功
如果類型定義帶有參數的話...
import <Foundation/Foundation.h>
// block有兩個類型為 string 的參數
typedef void (^CompletionBlock)(NSString *str1,NSString *str2);
@interface SampleClass : NSObject
- (void)actionWithCompletion:(CompletionBlock)completionBlock;
@end
@implementation SampleClass
- (void)actionWithCompletion:(CompletionBlock)completionBlock {
//前為 str1, 後為 str2, 有先後之分
completionBlock(@"tom",@"iOS developer");
}
@end
int main () {
SampleClass *sampleClass = [[SampleClass alloc] init];
[sampleClass actionWithCompletion:^(NSString *str1, NSString *str2) {
NSLog(@"我是 %@,職位: %@",str1,str2);
}];
return 0;
}
結果:
2021-09-25 01:36:01.848974+0800 TestOC[42683:1162447] 我是 tom,職位: iOS developer