您的位置:首页 > 其它

OC中的Block(块语法)相关知识

2015-07-24 20:04 423 查看
Block的数据类型

格式:

返回值类型: (^)(参数类型1
参数名1,
参数类型2 参数名2, ...)
注: 1.
没有参数,
括号不能省略

2.
参数名可以省略, 特殊情况下,
为了方便使用, 不省略

block赋值(实现)

//格式:

// ^(数据类型1
参数名,
数据类型2 参数名2, ...) {

//
执行代码

//}

注:

1.
参数名不能省略

2.
如果block有返回值,
需要使用return返回值

Block的运用

1.

使用typedef对block类型重命名

例:

2.
block内部访问变量

//block内部不能修改局部变量, 可以修改全局变量

//在block内部修改局部变量,
需要在局部变量前加__block

3.
block作为方法的参数(block排序)

例: 对一个数组内的字符串(数字)进行排序

//字符串是数字时的排序

NSArray *array3 = [NSArray arrayWithObjects:@"123", @"10", @"43", @"5", nil];

//使用block定义一个块方法

NSComparator ruleArray = ^(NSString *oil1, NSString *oil2) {

//字符串转为整型

NSInteger num1 = [oil1 integerValue];

NSInteger num2 = [oil2 integerValue];

//判断大小

if (num1 > num2) {

return NSOrderedDescending;//1

}

if (num1 < num2) {

return NSOrderedAscending;//-1

}

return NSOrderedSame;

};

NSArray *soft3 = [array3 sortedArrayUsingComparator:ruleArray];

NSLog(@"%@", soft3);

再来一个例子, 对一个学生数组, 按照学生成绩和姓名进行排序

Student *stu1 = [[Student alloc] initWithName:@"耿申" score:59.9];

Student *stu2 = [[Student alloc] initWithName:@"杨超" score:98];

Student *stu3 = [Student studentWithName:@"李高杰" score:80];

Student *stu4 = [Student studentWithName:@"葫芦娃" score:70];

//学生数组

NSArray *studentArray = [NSArray arrayWithObjects:stu1, stu2, stu3, stu4, nil];

//排序的学生数组

NSArray *sotr1 = [studentArray sortedArrayUsingComparator:^NSComparisonResult(Student *obj1, Student *obj2) {

if ([obj1 score] > [obj2 score]) {

return -NSOrderedDescending;//1

}

if ([obj1 score] < [obj2 score]) {

return -NSOrderedAscending;//-1

}

return NSOrderedSame;

}];

NSLog(@"---------按分数排序--------");

for (Student *stu in sotr1) {

NSLog(@"%@", stu);

}

NSLog(@"---------按姓名排序--------");

NSArray *sort = [studentArray sortedArrayUsingComparator:^NSComparisonResult(Student *obj1, Student *obj2) {

//获取两个相邻函数的名字

NSString *name1 = [obj1 name];

NSString *name2 = [obj2 name];
//先将汉字转化为拼音, 进行比较, 排序

//可变字符串1

NSMutableString *str1 = [NSMutableString stringWithString:name1];

//转成带声调的拼音

CFStringTransform((CFMutableStringRef)str1, NULL, kCFStringTransformToLatin, false);

//转成没有声调的拼音

CFStringTransform((CFMutableStringRef)str1, NULL, kCFStringTransformStripDiacritics, false);

//可变字符串2

NSMutableString *str2 = [NSMutableString stringWithString:name2];

//转成带声调的拼音

CFStringTransform((CFMutableStringRef)str2, NULL, kCFStringTransformToLatin, false);

//转成没有声调的拼音

CFStringTransform((CFMutableStringRef)str2, NULL, kCFStringTransformStripDiacritics, false);

return [str1 compare:str2];

}];

for (Student *stu1 in sort) {

NSLog(@"%@", stu1);

}
注: 这里面有一段方法是将汉字转化为拼音的, 不过有一定的局限性, 如果汉字是多音字的时候, 可能会转化的不太准确, 请大家慎重使用

以上个人总结的一些东西, 如果大家发现有错的话, 欢迎提出来, 大家一起进步哦!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: