Block(一)

2018-05-18  本文已影响0人  帽子和五朵玫瑰

Block专题

Block对象是一段代码如:

        ^{
            NSLog(@"这里是一个Block");
        };

在一个花括号内有一套指令。但是没有函数名,只有一个表示这段代码是一个Block对象

        ^(double dividend,double divisor){
            double q = dividend/divisor;
            return q;
        };

这个Block对象有两个实参,一个返回值。

Block对象可以被当成一个实参来传递给可以接收Block的方法,很多苹果的类都有可以接受Block为实参的方法。


int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSArray *originalString = @[@"SaueKraut",@"Raygun",@"Big Nerd Ranch",@"Mississippi"];
        NSLog(@"original string: %@",originalString);
        NSMutableArray *devowelizedString = [NSMutableArray array];
        NSArray *vowels = @[@"a",@"e",@"i",@"o",@"u"];
        void (^devowelizer)(id,NSUInteger,BOOL *);
        devowelizer = ^(id string,NSUInteger i,BOOL *stop){
            NSMutableString *newString = [NSMutableString stringWithString:string];
            for(NSString *s in vowels){
                NSRange fullRange = NSMakeRange(0, [newString length]);
                [newString replaceOccurrencesOfString:s
                                           withString:@""
                                              options:NSCaseInsensitiveSearch
                                                range:fullRange];
            }
            [devowelizedString addObject:newString];
        };
        [originalString enumerateObjectsUsingBlock:devowelizer];
        NSLog(@"这里%@", devowelizedString);
    }
    return 0;
}

enumerateObjectsUsingBlock:方法要求传入的Block对象的三个实参类型都是固定的。第一个实参是对象指针,指向当前(枚举)的对象。该指针的类型是id,所以无论数组包含的是什么类型的对象,都可以将地址赋给指针。第二个实参的类型是NSUInteger,其值是当前对象在数组中的索引。第三个实参是指向BOOL变量的指针,该变量的默认值是NO。如果将该值设为YES,那么数组对象会在执行完当前的Block对象后终止枚举过程

上一篇 下一篇

猜你喜欢

热点阅读