iOSblock基本使用方法 - 新聞資訊 - 雲南小程序開發|雲南軟件開發|雲南網站建設-昆明融晨信息技術有限公司

159-8711-8523

雲南網建設/小程序開發/軟件開發

知識

不(bù)管是(shì)網站,軟件還是(shì)小程序,都要(yào / yāo)直接或間接能爲(wéi / wèi)您産生價值,我們在(zài)追求其視覺表現的(de)同時(shí),更側重于(yú)功能的(de)便捷,營銷的(de)便利,運營的(de)高效,讓網站成爲(wéi / wèi)營銷工具,讓軟件能切實提升企業内部管理水平和(hé / huò)效率。優秀的(de)程序爲(wéi / wèi)後期升級提供便捷的(de)支持!

您當前位置>首頁 » 新聞資訊 » 技術分享 >

iOSblock基本使用方法

發表時(shí)間:2021-1-4

發布人(rén):融晨科技

浏覽次數:63


我們可以(yǐ)把Block當作一個(gè)閉包函數,它可以(yǐ)訪問外部變量和(hé / huò)局部變量,但默認是(shì)不(bù)可以(yǐ)修改外部變量。
你可以(yǐ)使用它來(lái)做回調方法,比起使用代理(Delegate)會更加直觀。
一、Block的(de)基本定義
Block的(de)基本寫法(也(yě)是(shì)詳細寫法):
returnType (^blockName)(params) = ^returnType(params) {
    // code... 
};

返回類型 (^Block的(de)名字)(Block的(de)參數) = ^返回類型(Block的(de)參數) { 這(zhè)裏放代碼 },例:
int (^myBlock)(int num1, int num2) = ^int(int num1, int num2){
    return 100;
};

 
如果你的(de)Block不(bù)需要(yào / yāo)返回類型和(hé / huò)參數,那麽你可以(yǐ)簡寫爲(wéi / wèi):
void (^myBlock2)() = ^(){
    
};


void (^myBlock2)(void) = ^void(void){
    
};

返回類型或參數,沒有的(de)話可以(yǐ)用“void”代替。
 
你也(yě)可以(yǐ)把等于(yú)号右邊,^後的(de)()删除,即是(shì):
void (^myBlock2)() = ^{
    
};

 
你也(yě)可以(yǐ)先定義一個(gè)Block函數,但不(bù)寫函數的(de)實現,我們可以(yǐ)在(zài)後面再寫具體函數的(de)實現,像這(zhè)樣:
void (^myBlock2)(void);
myBlock2 = ^{
    
};

 
 
二、Block作爲(wéi / wèi)方法定義
把Block定義在(zài)方法裏,與上(shàng)面不(bù)同的(de)是(shì),Block的(de)名字不(bù)需要(yào / yāo)在(zài)聲明時(shí)寫上(shàng),而(ér)是(shì)在(zài)後面,像這(zhè)樣:
[img]http://common.cnblogs.com/images/copycode.gif
- (void)getWtihBlock:(void (^)())block
{
    // code...
    
    // 記得要(yào / yāo)調用block
    block();
}

[img]http://common.cnblogs.com/images/copycode.gif
 
使用方法:
[self getWtihBlock:^{
    NSLog(@"sdf");
}];

 
下面作了(le/liǎo)一個(gè)詳細點的(de)例子(zǐ),并寫了(le/liǎo)備注:
[img]http://common.cnblogs.com/images/copycode.gif
/**
 *  追加自身字符串N次(每次複制前加一個(gè)換行\n)
 *
 *  @param string      字符串
 *  @param count       追加次數
 *  @param stringBlock 目标Block,其中str參數爲(wéi / wèi)結果字符串
 */
 // Block也(yě)可以(yǐ)定義在(zài)方法裏,但是(shì)不(bù)需要(yào / yāo)定義Block的(de)名字
 // IOS開發很多的(de)API也(yě)用到(dào)了(le/liǎo)Block,像UIView的(de)塊動畫
- (void)getStrWithString:(NSString *)string
               CopyCount:(int)count
            resultString:(void (^)(NSString *str))stringBlock
{
    NSMutableString *newString = [NSMutableString stringWithString:string];
    for (NSUInteger i = 0; i < count; i++) {
        NSUInteger len = [string length];
        NSString *insertString = [NSString stringWithFormat:@"\n%@", string];
        [newString insertString:insertString atIndex:len];
    }
    // 調用block,傳入字符串newString
    stringBlock(newString);
}

[img]http://common.cnblogs.com/images/copycode.gif
 
用法也(yě)是(shì)一樣:
[img]http://common.cnblogs.com/images/copycode.gif
BlockObject *block = [[BlockObject alloc] init];
[block getStrWithString:@"Garvey"
              CopyCount:3
           resultString:^(NSString *str) {
               // str爲(wéi / wèi)處理後的(de)結果
               NSLog(@"str is %@", str);
           }];

[img]http://common.cnblogs.com/images/copycode.gif
 
有時(shí)候複雜的(de)Block語法會令到(dào)函數的(de)聲明難以(yǐ)閱讀,所以(yǐ)會經常使用typedef對Block起一個(gè)新類型。
typedef void (^ResultBlock)(NSString *str);

 
定義方法時(shí)就(jiù)變成了(le/liǎo):
- (void)getStrWithString2:(NSString *)string
                CopyCount:(int)count
             resultString:(ResultBlock)stringBlock;

 
讓我們對比一下,使用typedef前後:
[img]http://common.cnblogs.com/images/copycode.gif
// 使用前
- (void)getStrWithString:(NSString *)string
               CopyCount:(int)count
            resultString:(void (^)(NSString *str))stringBlock;

// 使用後
- (void)getStrWithString2:(NSString *)string
                CopyCount:(int)count
             resultString:(ResultBlock)stringBlock;

[img]http://common.cnblogs.com/images/copycode.gif
注意:使用方法是(shì)一樣的(de),隻不(bù)過定義變得簡單了(le/liǎo)。

相關案例查看更多