Objective-C類定義了一個將資料與相關行為相結合的物件。 有時,僅表示單個任務或行為單元而不是方法集合是有意義的。
塊是C,Objective-C和C++等程式設計語言中的高階功能,它允許建立不同的程式碼段,這些程式碼段可以傳遞給方法或函式,就像它們是值一樣。 塊是Objective-C物件,因此它們可以新增到NSArray
或NSDictionary
等集合中。 它們還能夠從封閉範圍中捕獲值,使其類似於其他程式設計語言中的閉包或lambda
。
簡單塊宣告語法
returntype (^blockName)(argumentType);
簡單的塊實現 -
returntype (^blockName)(argumentType)= ^{
};
下面是一個簡單的範例程式碼 -
void (^simpleBlock)(void) = ^{
NSLog(@"This is a block");
};
呼叫上面塊的範例程式碼 -
simpleBlock();
塊也可以像方法和函式一樣獲取引數和返回值。
下面是一個使用引數和返回值實現和呼叫塊的簡單範例。
double (^multiplyTwoValues)(double, double) =
^(double firstValue, double secondValue) {
return firstValue * secondValue;
};
double result = multiplyTwoValues(2,4);
NSLog(@"The result is %f", result);
這是一個在塊中使用typedef
的簡單範例。 請注意,此範例不適用於線上編譯器。 它是使用XCode執行的。
#import <Foundation/Foundation.h>
typedef void (^CompletionBlock)();
@interface SampleClass:NSObject
- (void)performActionWithCompletion:(CompletionBlock)completionBlock;
@end
@implementation SampleClass
- (void)performActionWithCompletion:(CompletionBlock)completionBlock {
NSLog(@"Action Performed");
completionBlock();
}
@end
int main() {
/* 第一個Objective-C程式 */
SampleClass *sampleClass = [[SampleClass alloc]init];
[sampleClass performActionWithCompletion:^{
NSLog(@"Completion is called to intimate action is performed.");
}];
return 0;
}
執行上面範例程式碼,得到以下結果:
2018-11-10 08:14:57.105 demo[184:323] Action Performed
2018-11-10 08:14:57.108 demo[184:323] Completion is called to intimate action is performed.
塊在iOS應用程式和Mac OS X中使用得更多。因此,了解塊的用法更為重要。