块(Blocks)

作者:追风剑情 发布于:2019-2-26 15:50 分类:Objective-C

块是对C语言的一种扩展,它并未作为标准ANSI C所定义的部分,而是由Apple公司添加到语言中的。

示例

#import <Foundation/Foundation.h>

// 块能够定义为全局的或者局部的

void (^calculateTriangularNumber) (int) =
^(int n) {
    int i, triangularNumber = 0;
    
    for (i = 1; i <= n; ++i)
        triangularNumber += i;
    
    NSLog(@"Triangular number %i is %i", n, triangularNumber);
};

// 计算两个数的最大公约数
int (^gcd) (int, int) =
^(int u, int v) {
    int temp;
    
    while ( v != 0 )
    {
        temp = u % v;
        u = v;
        v = temp;
    }
    
    return u;
};

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // Objective-C中的块类似于C#中的匿名函数
        // 等号左边表示printMessage指向一个没有参数和返回值的块指针。
        void (^printMessage) (void) =
        ^(void) {
            NSLog(@"Programming is fun.");
        };
        
        printMessage();
        
        calculateTriangularNumber(10);
        calculateTriangularNumber(20);
        calculateTriangularNumber(50);
        
        // 块可以访问在其范围内定义的变量。变量的值同时作为块中定义的值。
        int foo = 10;
        // 插入块修改器 __block
        __block int moo = 10;
        
        void (^printFoo) (void) =
        ^(void) {
            NSLog(@"foo = %i", foo);
            NSLog(@"moo = %i", moo);
            // 不可以在块内部修改已经编译过的外部变量值
            //foo = 20; // ** 该行会产生编译错误
            moo = 20; // 因为外部变量moo用了__block关键字,所以块内部可以修改其值
        };
        
        foo = 15;
        moo = 15;
        
        printFoo();
    }
    return 0;
}

运行测试
111.png

标签: Objective-C

« 结构 | 函数»
Powered by emlog  蜀ICP备18021003号   sitemap

川公网安备 51019002001593号