OC 06 Block、数组高级
主要内容:
⼀、Block语法
⼆、Block使⽤
三、Block实现数组排序
Block简介
Block:块语法,本质上是匿名函数(没有名称的函数)
标准C⾥面没有Block,C语⾔言的后期扩展版本,加⼊了匿名函数。
C++、JS、Swift等语⾔,有类似语法,叫做闭包。 Block语法和函数指针很相似。
回顾函数指针
函数指针(变量):存放函数地址(函数名)的指针变量。
int (*p)(int x,int y) = sum;
函数指针类型:int (*)(int x,int y) 即:指向 两个整型参数,一个整型返回值函数的指针。
函数指针变量:p
函数指针的值:sum
Block
匿名函数:没有名称的函数。
例如 int (int x, int y)
因为Block是匿名函数,block变量存放的函数的实现,通过block变量能直接调⽤用函数
没有名称的函数应该如何调⽤用?(有名称的话,可以直接调⽤,也可以通过函数指针来调⽤用)
//1. ^ :脱字符
//在OC 语言中, '^'表示Block块 //声明一个block 变量
int (^sumBlock) (int, int) = ^(int a, int b){
return a+b;
};
NSLog(@"%d",sumBlock(,));
int (^maxBlock)(int , int ) = ^(int a, int b){
return a > b ? a:b;
};
int a = maxBlock(,);
NSLog(@"%d",a);
Block返回值类型:int (^maxBlock)(int a, int b) a,b可以不写
Block变量:a, b
Block变量存储的值:是实现部分
即: ^返回值类型 (参数列表) 函数体
Block 进行typedef
typedef in (^BlockType)(int x, int y)
原类型: int (^)(int x, int y)
新类型: BlockType
//给Block类型起一个别名
typedef int (^MaxBlock) (int, int);
MaxBlock sumBlock1 =^(int a, int b){
return a + b;
};
NSLog(@"%d",sumBlock1(,));
Block与局布变量的关系
//Block 与局部变量的关系 // int abc = 897; //局部变量 //__block修饰后 可以修改局部变量
__block int count = ;
void (^sayHi) (int) = ^(int c){
for (int i = ; i < count; i++) {
NSLog(@"嗨");
}
// abc = 90; //可以使用局部变量,不可修改局部变量 };
sayHi();
Block与局布变量的关系
//全局变量
int count = ;
int main(int argc, const char * argv[])
{
//Block 与全局变量
void (^addNum)(void) = ^(void){
count++;
NSLog(@"count = %d",count);
};
//调用
addNum();
//显示结果
NSLog(@"count = %d",count);
//练习1 用Block实现将字符串转为整形的功能
int (^strint) (NSString *) = ^(NSString *string){
return [string intValue];
};
int num = strint(@"");
NSLog(@"%d",num);
Block数组排序
//block数组排序
NSArray *stringArray = [ NSArray arrayWithObjects:@"a18",@"",@"",@"", nil]; NSComparator sortBlock = ^(id string1, id string2){
return [string1 compare:string2];
};
//将Block作为参数传递给方法
NSArray *sortArray = [stringArray sortedArrayUsingComparator:sortBlock];
NSLog(@"sortArray:%@",sortArray);
//使用Block给动态数组进行排序 //不可变数组用法二需要在前面接收一下
NSMutableArray *ageArray = [ NSMutableArray arrayWithObjects:@"", @"", @"", nil];
//法一
NSComparisonResult (^sortBlock) (id, id) = ^(id obj1, id obj2){
if ([obj1 intValue] > [obj2 intValue]) {
return NSOrderedDescending ;
}else if([obj1 intValue] < [obj2 intValue]){
return NSOrderedAscending;
}else{
return NSOrderedSame;
}
};
//将Block作为参数传递给方法
[ageArray sortUsingComparator:sortBlock];
NSLog(@"%@", ageArray);
//法二 (使用这种方法)
[ageArray sortUsingComparator:^NSComparisonResult(id obj3, id obj4) {
if ([obj3 intValue] > [obj4 intValue]) {
return NSOrderedAscending;
}else{
return NSOrderedSame;
}
}];
1. 创建Person类
实例变量: _name _age
方法:初始化方法
便利构造器
实例变量的赋值、取值方法
2. 创建3个Person对象,放入数组中
3. 在Person中添加compareByName:方法,使用此方法对数组进行排序,并输出
4. 使用Block根据Person的age进行排序,并输出
//根据age排序
Person *person1 = [ Person personWith:@"da" age:];
Person *person2 = [Person personWith:@"ji" age:];
Person *person3 = [Person personWith:@"ko" age:];
NSMutableArray *array = [NSMutableArray arrayWithObjects:person1,person2,person3, nil];
[array sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
if ([obj1 getAge] > [obj2 getAge]) {
return NSOrderedDescending;
}else {
return NSOrderedSame;
}
}];
NSLog(@"%@",array);
字面量

OC 06 Block、数组高级的更多相关文章
- OC语言Block 续
OC语言 Block 转载:http://blog.csdn.net/weidfyr/article/details/48138167 1.Block对象中的变量行为 结论: 在block代码块内部可 ...
- Oc中的数组
========================== 数组 ========================== 一.认识数组 oc中可以把NSObject对象的子类放到数组这个集合中,但是int.f ...
- OC语言BLOCK和协议
OC语言BLOCK和协议 一.BOLCK (一)简介 BLOCK是什么?苹果推荐的类型,效率高,在运行中保存代码.用来封装和保存代码,有点像函数,BLOCK可以在任何时候执行. BOLCK和函数的相似 ...
- 李洪强iOS开发之OC语言BLOCK和协议
OC语言BLOCK和协议 一.BOLCK (一)简介 BLOCK是什么? 苹果推荐的类型,效率高,在运行中保存代码.用来封装和保存代码,有点像函数,BLOCK可以在任何时候执行. BOLCK和函数的相 ...
- OC基础 可变数组与不可变数组的使用
OC基础 可变数组与不可变数组的使用 1.不可变数组 1.1不可变数组的创建 //实例方法 NSArray *array = [[NSArray alloc] initWithObjects:&quo ...
- OC语言-block and delegate
参考博客 OC语言BLOCK和协议 iOS Block iOS Block循环引用精讲 iOS之轻松上手block 深入浅出Block的方方面面 Block apple官方参考 1.定义一个block ...
- OC语言Block
OC语言Block 一.Block (一)简介 Block是什么?苹果推荐的比较特殊的数据类型,效率高,在运行中保存代码.用来封装和保存代码,有点像函数,BLOCK可以在任何时候执行. Block和 ...
- C#高级编程(第9版) 第06章 数组
好久没发东西了 , 一停下来就会变懒.... 虽然没完成,也就是它吧 --------------------------------- 以下正文 -------------------------- ...
- iOS开发-OC语言 (四)数组
知识点 1.NSArray 2.NSMutableArray 1.数组的基本用法: 2.数组的遍历 3.数组排序 =========== NSArray 不可变数组 ============= ...
随机推荐
- 状态压缩---UVA6625 - Diagrams & Tableaux
比赛的时候刷出来的第一个状态DP.(期间有点没有把握是状态DP呢.) 题意:题意还是简单的.K行的方格.之后输入L1~LK 代表每一行方格数.在这些往左紧挨的方格子里填上1~N的数字. 其中右边格子的 ...
- [洛谷P4900]食堂
题目大意:$n(n\leqslant10^6)$组询问,每组询问给出$l,r(l,r\leqslant10^6)$,求($\{\dfrac ij\}$表示$\dfrac ij$的小数部分): $$\s ...
- [2018国家集训队][UOJ449] 喂鸽子 [dp+组合数学]
题面 传送门 思路 首先,这道题是可以暴力min-max反演+NTT做出来的......但是这个不美观,我来讲一个做起来舒服一点的做法 一个非常basic的idea:我们发现在一只鸽子吃饱以后再喂给它 ...
- BZOJ4597:[SHOI2016]随机序列——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4597 你的面前有N个数排成一行.分别为A1, A2, … , An.你打算在每相邻的两个 Ai和 ...
- BZOJ3172:[TJOI2013]单词——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=3172 某人读论文,一篇论文是由许多单词组成.但他发现一个单词会在论文中出现很多次,现在想知道每个单 ...
- 项目管理---git----快速使用git笔记(四)------远程项目代码的首次获取
使用git最常见的场景是 你需要参与到一个项目中,而这个项目的代码,同事已经上传到github或者https://coding.net了. 这时候他会给你一个项目代码的远程仓库链接. 例如: http ...
- Codeforces VK Cup Finals #424 Div.1 A. Office Keys(DP)
显然是不可能交叉取钥匙的,于是把钥匙和人都按坐标排序就可以DP了 钥匙可以不被取,于是f[i][j]表示前i个钥匙被j个人拿的时间 f[i][j]=min(f[i-1][j],max(f[i-1][j ...
- PHP 无限级分类树
1. function generateTree($items){ $tree = array(); foreach($items as $item){ if(isset($ ...
- 直通BAT面试算法精讲课 --动态规划
1.有数组penny,penny中所有的值都为正数且不重复.每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim(小于等于1000)代表要找的钱数,求换钱有多少种方法. 给定数 ...
- 如何在Linux上安装QQ
我一直无法解决Ubuntu QQ问题,而最近我重装ubuntu之后在网络上找到与QQ相关的内容,网上有大神开发出了新版的wineQQ,解决了我们对QQ的需求.经过尝试,完成了QQ安装 如图 安装的是 ...