(译)IOS block编程指南 2 block开始
2015-09-09 10:05
483 查看
Getting Started with Blocks(开始block)
The following sections help you to get started with blocks using practical examples.接下来这一节有实用的例子帮你开始blocks.
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:
这个例子在下面的说面中得到了解释:
myBlock 的返回值是int类型的 。
我们使用^声明了一个myBlock的block。
只需要一个参数,也是int类型的。
参数名是num。这是一个块的定义,
给myblock赋值。
这是block的主体。
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 standard
qsort_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 the Cocoa frameworks take 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
sortedArrayUsingComparator:. The method takes a single argument—the block. For illustration, in this case the block is defined as an
NSComparatorlocal variable:
Cocoa 框架中有一些方法使用block作为一个参数,特别是对多个对象进行操作,或者在一个操作结束之后回调。下面的例子展示了NSArray怎样在方法sortedArrayUsingComparator:中使用block。这个方法使用了一个参数——block。为了说明,这个block被定义为NSComparator类型的一个局部变量:
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 in Blocks 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 uses
currentLocaleas 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", @"Strîng 21", // <- @"Striñg 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 in Blocks and Variables.
更详细的讨论请看:Blocks and Variables.
本文原创,转载请注明出处:http://blog.csdn.net/zhenggaoxing/article/details/44303047
相关文章推荐
- iOS xib 与StoryBoard 之间的互相,以及StoryBoard与StoryBoard之间跳转
- (译)IOS block编程指南 1 介绍
- iOS html转换为字符串
- 【IOS学习】Core Graphics 框架学习笔记,以及demo
- iOS视图生命周期
- 关于IOS中NSNumberFormatter的认识
- iOS开发中实现邮件和短信发送的简单示例
- 【读书笔记】iOS-自动释放池
- 【读书笔记】iOS-自动释放池
- IOS中 Block简介与用法(一)
- IOS 根据日期,获取该日期所在周,月,年的开始日期,结束日期 的方法,还有下一周或者上一周的时间
- iOS 笔记七:block
- iOS SDK: Working with URL Schemes
- The Complete Tutorial on iOS/iPhone Custom URL Schemes
- iOS开发一款小巧简洁的日历控件
- iOS开发利器-CocoaPods安装和使用教程
- ios-音频播放-短视频加载-封装工具类
- Runtime运行时机制
- iOS textView 高度自适应
- 给学习iOS开发同学的建议