块代码编程---开始使用块代码
http://blog.csdn.net/nicktang/article/details/6906352
本章的几节使用例子代码来开始块代码的学习。
定义和使用块代码
插入符^有两个作用,一个是声明一个块代码变量,另一个是开始一个块代码的定义。块代码的代码部分是包含在一对大括号中的,就像下面演示的这样(使用C语言风格的分号;作为块代码行的结束):
int multiplier = 7; |
int (^myBlock)(int) = ^(int num) { |
return num * multiplier; |
}; |
下图是对块代码的详细演示:
主义块代码中可以使用和它有同一个生存域的变量的。
如果你声明了一个块代码变量,你可以在后面像使用函数一样使用它:
int multiplier = 7; |
int (^myBlock)(int) = ^(int num) { |
return num * multiplier; |
}; |
printf("%d", myBlock(3)); |
// prints "21" |
直接使用块代码
很多情况下,你不需要声明块代码变量,你把一个块代码直接做内联实现,然后作为函数参数传入函数。下面的例子使用函数qsort_b
。
qsort_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”中有更多细节描述。
块代码编程---开始使用块代码相关推荐
- c语言 源程序代码,编程(C语言源程序代码)
编程(C语言源程序代码) 已知 S=1+1/(1+2)+1/(1+2+3)+-+1/(1+2+3+-+N) ,当N的值为50时,求S的值. 要求:按四舍五入的方式精确到小数点后第四位. #includ ...
- python代码编程教学入门,python代码编程火影忍者
python源代码编程软件 编写python源代码的软件.首推的Pycharm. PyCharm用于bai一般IDE具备的功能,比如, 调试.语法高亮.Project管理.du代码跳转.智能提示.自动 ...
- java range(10)_Java 中的十个 ” 单行代码编程 ” ( OneLiner )
原标题:Java 中的十个 " 单行代码编程 " ( OneLiner ) 作者:飒然Hang 原文链接:www.rowkey.me/blog/2017/09/09/java-on ...
- 无代码编程时代下,程序员要失业了?
作者 | Phodal 责编 | 伍杏玲 [CSDN 编者按]"中台之后,便是无代码编程."无代码编程是什么?开发流程是怎么样的?有何优缺点? 无代码编程时代来了,就不需要程序员编 ...
- 敲代码括号技巧_理解代码块概念,养成良好编程习惯 | 亲子课堂 第 3 课
亲子课堂 关卡解析 / 英语教学 / 编程讲解 做亲子编程教育的好帮手! 每周二.四定期更新 地牢 面向真正0编程基础的孩子们,关卡被设计成迷宫的形式,引导孩子们使用编程思维解决问题. 以循序渐进的方 ...
- 一文带你深入理解【Java基础】· 面向对象编程(下)②代码块、final和abstract
写在前面 Hello大家好, 我是[麟-小白],一位软件工程专业的学生,喜好计算机知识.希望大家能够一起学习进步呀!本人是一名在读大学生,专业水平有限,如发现错误或不足之处,请多多指正!谢谢大家!!! ...
- Java 编程下的同步代码块
为了便于理解先来看看没有加同步代码块的 2 组同样功能的代码在不同状态下的执行结果,下面看第一组: package cn.wangjwei.synchronize;public class Synch ...
- 存储过程可重用的代码块_如何使您的代码可重用
可重用代码不是通用代码 Image Credits: Pixabay.com 可重用的代码作为解决所有软件问题的一站式解决方案,是一个危险的神话. 让我解释一下原因. 假设您正在编写软件库. 您脑中冒 ...
- 利用有穷自动机去除C语言代码行注释(//)以及块注释(/* */)
一. 程序设计题目与说明 利用有穷自动机去除C语言代码行注释(//)以及块注释(/* */) 该有穷自动机的状态转换图如下: 二. 核心代码(或全部代码) #include<stdio.h> ...
最新文章
- InfluxDB:cannot use field in group by clause
- ACM思维题训练 Section A
- Xampp配置本地域名及常见错误解决
- Matlab——对比度拉伸
- 每天学一点flash(76)百度MP3音乐APi接口使用
- c# 多线程单例模式_线程安全C#单例模式
- Linux系统,Hadoop,R语言,RHadoop的安装
- 取代奶瓶Minidwep-gtk破解WPA 全攻略
- PSM模型(价格敏感测试模型)
- windows7桌面计算机作用,win7系统虚拟桌面功能的详细教程
- JavaScript的BOM(浏览器对象模型)部分知识点与DOM(文档对象模型)
- Day 3 Linux(目录篇 、文件操作篇 、压缩解压相关命令, 编辑器vi 、编译器gcc 、调试器gdb、 makefile工程管理器初学)
- 深度相机介绍(TOF、RGB双目、结构光参数对比)
- 深度学习框架PyTorch入门与实践:第九章 AI诗人:用RNN写诗
- 剑灵系统推荐加点_新版剑灵怎么加点(2019剑灵技能加点在哪里)
- poi读取excel多层表头模板写入数据并导出
- VBA生成和为定值的随机数
- pycharm 选中多行,点back space键无法删除
- IT小天个人技术博客
- hiho #1474 : 拆字游戏(dfs)@