IOS block编程指南 2 block开始

Declaring and Using a Block (定义和使用block)

You use the^operator to declare a block variable and to indicate the beginning of a block literal. The body of the block itself is contained within{}, as shown in this example (as usual with C,;indicates the end of the statement):

你使用^操作定义一个block值同时表示了一个block的开始。block的主题被{}包围,就像例子中展示的那样(就像通常的C中,分号;申明了一个语句的结束):

int multiplier = 7;

int (^myBlock)(int) = ^(int num) {

return num * multiplier;

};

The example is explained in the following illustration:

这个例子在下面的说面中得到了解释:

Notice that the block is able to make use of variables from the same scope in which it was defined.

If you declare a block as a variable, you can then use it just as you would a function:

注意block可以使用定义在block定义作用用中的变量。

如果你把block定义成了一个变量,你可以像使用函数一样使用block。

int multiplier = 7;

int (^myBlock)(int) = ^(int num) {

return num * multiplier;

};

printf("%d", myBlock(3));

// prints "21"

Using a Block Directly(直接使用block)

In many cases, you don’t need to declare block variables; instead you simply write a block literal inline where it’s required as an argument. The following example uses theqsort_bfunction.qsort_bis similar to the standardqsort_rfunction, but takes a block as its final argument.

在很多情况下你不需要把block定义成一个变量;相反的你可以直接写出一个block作为参数。下面的例子用到了qsort_b函数,qsort_b很类似标准的qsort_r函数,是指使用一个block作为一最后一个参数。

char *myCharacters[3] = { "TomJohn", "George", "Charles Condomine" };

qsort_b(myCharacters, 3, sizeof(char *), ^(const void *l, const void *r) {

char *left = *(char **)l;

char *right = *(char **)r;

return strncmp(left, right, 1);

});

// myCharacters is now { "Charles Condomine", "George", "TomJohn" }

Blocks with Cocoa(cocoa中的block)

Several methods in theCocoaframeworkstake a block as an argument, typically either to perform an operation on a collection of objects, or to use as a callback after an operation has finished. The following example shows how to use a block with theNSArraymethod. The method takes a single argument—the block. For illustration, in this case the block is defined as anlocal variable:

Cocoa 框架中有一些方法使用block作为一个参数,特别是对多个对象进行操作,,或者在一个操作结束之后回调。下面的例子展示了NSArray怎样在方法中使用block。这个方法使用了一个参数——block。为了说明,这个block被定义为类型的一个局部变量:

NSArray *stringsArray = @[ @"string 1",

@"String 21",

@"string 12",

@"String 11",

@"String 02" ];

static NSStringCompareOptions comparisonOptions = NSCaseInsensitiveSearch | NSNumericSearch |

NSWidthInsensitiveSearch | NSForcedOrderingSearch;

NSLocale *currentLocale = [NSLocale currentLocale];

NSComparator finderSortBlock = ^(id string1, id string2) {

NSRange string1Range = NSMakeRange(0, [string1 length]);

return [string1 compare:string2 options:comparisonOptions range:string1Range locale:currentLocale];

};

NSArray *finderSortArray = [stringsArray sortedArrayUsingComparator:finderSortBlock];

NSLog(@"finderSortArray: %@", finderSortArray);

/*

Output:

finderSortArray: (

"string 1",

"String 02",

"String 11",

"string 12",

"String 21"

)

*/

__block Variables(_block 类型变量)

A powerful feature of blocks is that they can modify variables in the same lexical scope. You signal that a block can modify a variable using the__blockstorage type modifier. Adapting the example shown inBlocks with Cocoa, you could use a block variable to count how many strings are compared as equal as shown in the following example. For illustration, in this case the block is used directly and usescurrentLocaleas a read-only variable within the block:

block的另一个强大的特性是可以修改同一词法范围的变量。你可以把一个block想修改的变量声明成_block类型。改写Blocks with Cocoa中的例子,你可以在下面的例子中使用block变量统计有多少字符串是相同的。为了说明需要,例子中直接使用block,同时把currentLocate作为一个block中的只读变量。

NSArray *stringsArray = @[ @"string 1",

@"String 21", // <-

@"string 12",

@"String 11",

@"Strng 21", // <-

@"Strig 21", // <-

@"String 02" ];

NSLocale *currentLocale = [NSLocale currentLocale];

__block NSUInteger orderedSameCount = 0;

NSArray *diacriticInsensitiveSortArray = [stringsArray sortedArrayUsingComparator:^(id string1, id string2) {

NSRange string1Range = NSMakeRange(0, [string1 length]);

NSComparisonResult comparisonResult = [string1 compare:string2 options:NSDiacriticInsensitiveSearch range:string1Range locale:currentLocale];

if (comparisonResult == NSOrderedSame) {

orderedSameCount++;

}

return comparisonResult;

}];

NSLog(@"diacriticInsensitiveSortArray: %@", diacriticInsensitiveSortArray);

NSLog(@"orderedSameCount: %d", orderedSameCount);

/*

Output:

diacriticInsensitiveSortArray: (

"String 02",

"string 1",

"String 11",

"string 12",

"String 21",

"Str\U00eeng 21",

"Stri\U00f1g 21"

)

orderedSameCount: 2

*/

This is discussed in greater detail inBlocks and Variables.

更详细的讨论请看:Blocks and Variables.

本文原创,转载请注明出处:

我就想是一只草原中被牧童遗忘的羊,

IOS block编程指南 2 block开始

相关文章:

你感兴趣的文章:

标签云: