Block语法、Block实现数组排序
Student.h
#import <Foundation/Foundation.h>
@interface Student : NSObject{
NSString *_name; //姓名
NSString *_sex; //性别
NSInteger _age; //年龄
NSInteger _num;
}
//声明自定义初始化方法
-(instancetype)initWithName:(NSString *)name andSex:(NSString *)sex andAge:(NSInteger)age Num:(NSInteger)num;
//声明一个便利构造器方法
+(instancetype)studentWithName:(NSString *)name andSex:(NSString *)sex andAge:(NSInteger)age Num:(NSInteger)num;
//setter
-(void)setName:(NSString *)name;
-(void)setSex:(NSString *)sex;
-(void)setAge:(NSInteger)age;
-(void)setNum:(NSInteger)num;
//getter
-(NSString *)name;
-(NSString *)sex;
-(NSInteger)age;
-(NSInteger)num;
//重写
-(NSString *)description;
@end
Student.m
#import "Student.h"
@implementation Student
//实现自定义初始化方法
-(instancetype)initWithName:(NSString *)name
andSex:(NSString *)sex
andAge:(NSInteger)age
Num:(NSInteger)num{
self = [super init];
if (self) {
_name = name;
_sex = sex;
_age = age;
_num = num;
}
return self;
}
//实现一个便利构造器方法
+(instancetype)studentWithName:(NSString *)name
andSex:(NSString *)sex
andAge:(NSInteger)age
Num:(NSInteger)num{
return [[self alloc] initWithName:name andSex:sex andAge:age Num:num];
}
//setter
-(void)setName:(NSString *)name{
_name = name;
}
-(void)setSex:(NSString *)sex{
_sex = sex;
}
-(void)setAge:(NSInteger)age{
_age = age;
}
-(void)setNum:(NSInteger)num{
_num = num;
}
//getter
-(NSString *)name{
return _name;
}
-(NSString *)sex{
return _sex;
}
-(NSInteger)age{
return _age;
}
-(NSInteger)num{
return _num;
}
//重写信息描述方法,就是nslog打印信息显示的内容
-(NSString *)description{
// NSLog(@"name: %@ sex: %@ age: %ld",_name,_sex,_age);
return [NSString stringWithFormat:@"name: %@ sex: %@ age: %ld num: %ld",_name,_sex,_age,_num];
};
@end
main.m
#import <Foundation/Foundation.h>
#import "Student.h"
//声明函数
int maxNum(int a, int b);
//实现函数
int maxNum(int a,int b){
return a > b ? a : b;
}
int number = 10;
int main(int argc, const char * argv[]) {
/*
// 函数的实现包括3部分:函数的声明 函数的定义 函数的调用
int maxNumber = maxNum(3,5);
NSLog(@"maxNumber = %d",maxNumber);
// 函数的 类型是由返回值类型和参数类型组成
// 声明一个函数指针变量,p_max 表示指针变量名字
int (*p_max) (int, int);
// 函数指针赋值: 函数名就是一个函数指针,就是这个函数的地址
p_max = maxNum;
int max1 = p_max(4,7);
NSLog(@"max1 = %d",max1);
// 对函数指针类型进行重命名, pMax 表示函数指针类型的别名
typedef int (*pMax) (int,int);
pMax maxnum = maxNum;
int max2 = maxnum(9,1);
NSLog(@"max2 = %d",max2);
// int表示返回值类型,(int,int)是参数类型;sumBlock表示变量名称;(^)拖字符的作用是一个标识,标识sumBlock是一个block变量
int (^sumBlock) (int, int);
// 在定义值的部分,返回值是可以省略的
sumBlock = ^int(int a ,int b){
return a + b ;
};
int sum = sumBlock(3,5);
NSLog(@"sum = %d",sum);
// 练习一
// 写⼀个 返回值为整型 参数为NSString(仅一个参数)的block,实现将字符串转换为整型的功能。
int (^intStr) (NSString *) = ^int (NSString *s){
return [s intValue];
};
// 字符串转成整型数只能转数字字符,遇到其他字符结束
int strInt = intStr(@"12a3");
NSLog(@"strInt = %d",strInt); //strInt = 12
// 对block类型进行重命名,blockType是block类型的名称
typedef int (^blockType) (NSString *);
blockType s = intStr;
NSLog(@"s = %d",s(@"2345"));
blockType s21 = ^(NSString *s){
NSLog(@"s = %@",s);
return 0;
};
s2(@"asdf");
__block int num = 10; //如果想在block中修改外面的局部变量,用__block进行修饰;
NSLog(@"num = %d",num);
void (^numBlock) (void) = ^(void){
num = num + 1; //在block 中不能修改block外面的局部变量
NSLog(@"num = %d",num);
number++;//全局变量在block中是可以进行修改的
};
num = 11;
numBlock(); //num = 10
NSArray *array = [NSArray arrayWithObjects:@"11",@"44",@"33",@"66", @"22",nil];
// 用系统重命名的block类型定义一个block;实现的是排序的条件
NSComparator cmp = ^(NSString *s1,NSString *s2){
return [s1 compare:s2];
};
// NSArray *sortArray = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
// return [obj2 compare:obj1];
// }];
// 用block变量作为参数,实现排序条件的选择
NSArray *sortArray = [array sortedArrayUsingComparator:cmp];
NSLog(@"sortArray = %@",sortArray);
*/
// 创建Student对象
Student *s1 = [Student studentWithName:@"xiaoming" andSex:@"女" andAge:20 Num:1];
Student *s2 = [Student studentWithName:@"xiaowang" andSex:@"男" andAge:30 Num:3];
Student *s3 = [Student studentWithName:@"zhangfei" andSex:@"女" andAge:26 Num:5];
Student *s4 = [Student studentWithName:@"lisi" andSex:@"男" andAge:44 Num:4];
Student *s5 = [Student studentWithName:@"wangwu" andSex:@"男" andAge:22 Num:2];
// 创建学生数组
NSMutableArray *studentArray = [NSMutableArray arrayWithObjects:s1,s2,s3,s4,s5,nil];
// 按年龄排序
// [studentArray sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
// return [obj1 age] > [obj2 age];
BOOL result = [obj1 age] > [obj2 age];
if (result) {
return 1;
}
return 0;
// }];
//
// NSLog(@"studentArray = %@", studentArray);
//按学号升序排列
[studentArray sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
return [obj1 num] > [obj2 num];
}];
NSLog(@"studentArray = %@",studentArray);
// //按姓名升序排列
[studentArray sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
return [[obj1 name] compare: [obj2 name]];
}];
NSLog(@"studentArray = %@",studentArray);
//
//
// NSComparator cmp = ^(NSString *s1,NSString *s2){
// return [[s1 name] compare:[s2 name]];
// };
// NSMutableArray *sortStu = [studentArray sortedArrayUsingComparator:cmp];
// NSLog(@"排序后:%@",studentArray);
/*
// 在oc 中使用字面量,前面有@表示创建对象;没有@的字面量是取值操作
NSNumber *num1 = [NSNumber numberWithInt:10];
NSNumber *num2 = @2;
NSLog(@"num2 = %@",num2);
NSArray *array = @[num1,num2];
NSLog(@"array = %@",array);
NSDictionary *dic = @{@"1":num1,@"2":num2};
NSLog(@"dic = %@",dic);
NSLog(@"array.1 = %@",array[1]);
NSLog(@"dic.1 = %@",dic[@"1"]);
*/
return 0;
}