OC第六天

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值