`
sogotobj
  • 浏览: 652253 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

块代码编程---开始使用块代码

 
阅读更多

本文档版权归NickTang所有,没有本人书面或电子邮件允许,不许转载,摘录,发表。多谢!


本章的几节使用例子代码来开始块代码的学习。

定义和使用块代码

插入符^有两个作用,一个是声明一个块代码变量,另一个是开始一个块代码的定义。块代码的代码部分是包含在一对大括号中的,就像下面演示的这样(使用C语言风格的分号;作为块代码行的结束):

int multiplier = 7;
int (^myBlock)(int) = ^(int num) {
    return num * multiplier;
};

下图是对块代码的详细演示:

image: ../Art/blocks.jpg

主义块代码中可以使用和它有同一个生存域的变量的。

如果你声明了一个块代码变量,你可以在后面像使用函数一样使用它:

int multiplier = 7;
int (^myBlock)(int) = ^(int num) {
    return num * multiplier;
};
 
printf("%d", myBlock(3));
// prints "21"

直接使用块代码

很多情况下,你不需要声明块代码变量,你把一个块代码直接做内联实现,然后作为函数参数传入函数。下面的例子使用函数qsort_bqsort_b和函数qsort_r很像,不过它使用一个块代码作为参数。

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" }

Cocoa中的块代码

Cocoa框架中有不少函数是使用块代码作为参数的,特别是在容器类中的包含对象的操作,或者一个操作完成后的回调函数。下面的例子演示了在NSArray类中的sortedArrayUsingComparator:函数中使用块代码,这个函数仅有一个参数,就是这个块代码,为了演示,块代码被声明为NSComparator类型的本地变量:

NSArray *stringsArray = [NSArray arrayWithObjects:
                                 @"string 1",
                                 @"String 21",
                                 @"string 12",
                                 @"String 11",
                                 @"String 02", nil];
 
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类型变量

块代码的一个更强力的功能是可以修改具有同一可视周期的变量。当然你必须使用__block来修饰这个变量。考虑上节中的例子,如果我们需要使用一个变量来做一个统计,就像下例一样。这里的currentLocale变量对于代码块内部而言就是只读的。

NSArray *stringsArray = [NSArray arrayWithObjects:
                         @"string 1",
                         @"String 21", // <-
                         @"string 12",
                         @"String 11",
                         @"Strîng 21", // <-
                         @"Striñg 21", // <-
                         @"String 02", nil];
 
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
*/

这个内容在“Blocks and Variables”中有更多细节描述。

分享到:
评论

相关推荐

    商业编程-源码-VC开发工具使用技巧源代码 CodeTmplExBin.zip

    在本资源"商业编程-源码-VC开发工具使用技巧源代码 CodeTmplExBin.zip"中,包含的是关于Visual C++(简称VC)开发工具的一些实用技巧和源代码。这个压缩包很可能是为了帮助开发者提升在VC环境下的编程效率和代码质量...

    商业编程-源码-Shell编程源代码 propsheethandler.zip

    为了提高代码的可读性和维护性,Shell编程还遵循一定的最佳实践,如合理地使用注释、保持代码简洁、避免复杂的嵌套结构、使用适当的变量命名以及使用函数模块化等。 总的来说,"商业编程-源码-Shell编程源代码 ...

    11--[方块].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码

    11--[方块].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码11--[方块].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码11--[方块].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码11--...

    27--[解救方块].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码

    27--[解救方块].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码27--[解救方块].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码27--[解救方块].zip源码scratch2.0 3.0编程项目源文件源码案例素材源...

    商业编程-源码-SyntaxHighlighter高亮代码显示实例源码.zip

    这个压缩包文件“商业编程-源码-SyntaxHighlighter高亮代码显示实例源码.zip”包含了使用SyntaxHighlighter实现代码高亮的示例源代码,适合于那些想要在自己的商业网站或博客上展示技术文章、教程或者分享代码片段的...

    商业编程-源码-VC开发工具使用技巧源代码 code_template_sandy.zip

    在商业编程领域,Visual C++(简称VC)是一款强大的开发工具,...通过对"code_template_sandy.zip"中的源代码进行学习和研究,开发者可以深入理解VC开发工具的使用,提升编程技能,为商业项目提供更高效、可靠的代码。

    c和c++代码精粹--优秀的代码

    本文将深入探讨C和C++代码精粹,揭示其中的优秀实践和核心知识点,帮助读者提升编程技能。 1. **C语言基础** - **指针**:C语言的灵魂在于指针,理解指针的使用、动态内存分配以及指针运算至关重要。 - **预...

    Java代码编程规范.doc

    Java代码编程规范是确保代码可读性、可维护性和团队协作效率的重要指导原则。遵循一套良好的编程规范,可以使代码更加整洁、易于理解,减少出错的可能性,并提高代码质量。以下是一些关键的Java编程规范: 1. **...

    商业编程-源码-C语言风格与编码标准.zip

    每个函数应独立成块,使用空行分隔不同功能的代码段。缩进通常使用4个空格,避免使用制表符以减少格式混乱。 4. **注释**:清晰的注释能够帮助他人理解代码的功能和逻辑。每函数上方应有简短的描述,解释其目的和...

    工业机器人现场编程-循环技术编程-课件.pptx

    1. **for循环**:for循环是一种在编程中用于重复执行某段代码的结构。在工业机器人编程中,for循环常用来控制机器人的动作重复执行一定次数。例如,在这个任务中,你需要让机器人连续取六块物料并摆放到卸垛区。for...

    GPU高性能编程CUDA实战-代码

    《GPU高性能编程CUDA实战-代码》是一份针对CUDA编程技术的实践教程,旨在帮助开发者深入理解和应用GPU(图形处理器)的并行计算能力。CUDA,全称Compute Unified Device Architecture,是NVIDIA公司推出的一种用于...

    从零开始学编程-Java篇

    学会使用try-catch-finally语句块来捕获和处理异常,是编写健壮代码的关键。 容器和集合框架是Java库的一部分,它们提供了存储和管理对象的方式。ArrayList、LinkedList、HashSet和HashMap等是常见的集合类型,你...

    方块-少儿编程scratch项目源代码文件案例素材.zip

    "方块-少儿编程scratch项目源代码文件案例素材.zip"是一个包含了使用Scratch制作的游戏项目源代码,名为"方块.sb2"。这个文件是一个完整的项目文件,包含了一系列编程指令,用于控制游戏中的角色、动画和交互逻辑。 ...

    C#入门到精通全部源代码----2

    在本资源"C#入门到精通全部源代码----2"中,我们主要关注的是C#编程语言的学习和发展。作为"C#入门到精通全部源代码----1"的延续,这个压缩包包含了一系列的源代码文件,旨在帮助初学者和进阶者深入理解和实践C#的...

    C#范例开发大全源代码--刘丽霞版

    【标题】"C#范例开发大全源代码--刘丽霞版" 提供的是一个针对C#编程语言的实例教程的源代码集合。这个资源可能是《C#范例开发大全》这本书或者相关教学课程配套的代码示例,由作者刘丽霞编著。通过这些源代码,学习...

    《Python编程快速上手》-代码

    - **条件语句**:if-elif-else结构用于根据条件执行不同的代码块。 - **循环语句**:for和while循环是Python中的两种循环结构,用于重复执行一段代码。 - **函数定义**:函数是可重用的代码块,可以接受参数并...

    C++编程-编码规范

    - 使用多行注释(/*...*/)进行块注释,单行注释(//)用于行内注释。 3. **代码布局**: - 使用一致的缩进风格,通常为4个空格。 - 保持代码段整洁,每个函数不宜过长,一般不超过100行。 - 控制每行字符数,...

    并发数据结构与多核编程-大作业-完整代码-三套

    分享自己整理和改进过的编程作业代码,有用的话,欢迎点赞收藏。 中国科学院大学,并发数据结构与多核编程_大作业,列车售票系统。

    PLSQL高级编程-结构化编程

    匿名块是未命名的PLSQL代码块,通常用于测试和调试。存储过程和函数则用于封装可重用的代码,其中函数返回值,而过程不返回。包则是一种组织和管理相关过程、函数和类型的有效方式。 四、异常处理 PLSQL支持预定义...

    平台Java代码编程规范

    - 使用空行来分隔功能相关的代码块,增加可读性。 - 在大括号内保持一致的缩进,如`if`、`for`、`while`等控制结构。 - 函数定义应当紧凑,避免过长的函数,以提高可维护性。 【命名规则】 命名规则是Java编程规范...

Global site tag (gtag.js) - Google Analytics