iT邦幫忙

2021 iThome 鐵人賽

DAY 5
0
自我挑戰組

iOS 菜鳥工程師的30天 objective-C系列 第 7

Day 07- Blocks

Objective-C class 定義一個物件(object),該物件含有資料和一些行為。有時可能只是些簡單的任務或行為單元,而不是一個方法。類似於Swift closure

此時可以使用 Blocks,它可以創建不同的 code 片段,這些片段像值(value)一樣傳給方法。

Blocks 是 Objective-C objects,這意味著它們可以被加到像 NSArray 或 NSDictionary 中。

簡單的 Block 聲明語法

returntype (^blockName)(argumentType);

簡單的 Block 執行(implementation)

returntype (^blockName)(argumentType)= ^{
};

ex.

void (^simpleBlock)(void) = ^{
   NSLog(@"This is a block");
};

調用

simpleBlock();

Blocks 帶參數跟返回值

這是一個簡單的範例,用來實現和調用帶有參數與返回值的 block

int (^add) (int, int) = ^ (int num1, int num2){
    return num1 + num2;
};

int addValue = add(2,4);    
NSLog(@"addValue值為:%d",addValue);

Blocks 使用類型定義(Type Definitions)

有點類似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

上一篇
Day 06 - Function
下一篇
Day08 - Numbers
系列文
iOS 菜鳥工程師的30天 objective-C10

尚未有邦友留言

立即登入留言