Objective-C塊


Objective-C類定義了一個將資料與相關行為相結合的物件。 有時,僅表示單個任務或行為單元而不是方法集合是有意義的。

塊是C,Objective-C和C++等程式設計語言中的高階功能,它允許建立不同的程式碼段,這些程式碼段可以傳遞給方法或函式,就像它們是值一樣。 塊是Objective-C物件,因此它們可以新增到NSArrayNSDictionary等集合中。 它們還能夠從封閉範圍中捕獲值,使其類似於其他程式設計語言中的閉包或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中使用得更多。因此,了解塊的用法更為重要。