oc Block / NSComparisonResult排序 / 字面量



#import <Foundation/Foundation.h>
#import "Person.h"
int number2=9;

/*
int sum(int num1,int num2);
int sum(int num1,int num2){
    int sum=0;
    sum=num1+num2;
    return sum;
}
//函数指针
int (*temp)(int ,int );
//取别名
typedef int (*temp_sum)(int,int);
 */

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        /*
        int a=3,b=5;
        int result=sum(a, b);
        printf("result=%d\n",result);
        
        temp=sum;
        temp(a,b);
        //定义一个函数指针变量
        temp_sum p_sum=sum;
        p_sum(a,5);
         */
#pragma mark ----- Block ---------
        //Block  ^拖字符 标志后面的变量是Block变量
        //跟函数指针特别像
        //返回值类型 (^变量名)(参数列表)=^返回值类型(参数列表){函数体}
;
        int (^MyBlock)(int num1,int num2)=^int(int num1,int num2){
            //这里的函数体跟之前的函数调用机理一样,只有当被调用的时候,这里的函数体才会被执行
            return num1+num2;
        };
        int sum=MyBlock(3,5);
        NSLog(@"sum=%d",sum);
        
        void (^MyBlock1)(int,int)=^(int num1,int num2){
//            int sum=num1+num2;
            printf("%d\n",num1+num2);
  
        };
        MyBlock1(3,8);
        
        
        BOOL (^BlockBOOL)(float,float)=^(float a,float b){
            BOOL r= a>b?YES:NO;
            return r;
        };
        NSLog(@"返回结果:%d",BlockBOOL(1.2,3.4));
        
        float (^BlockFloat)(float,float)=^(float a,float b){
            float sum=a+b;
            return sum;
        };
        NSLog(@"返回结果:%.2f",BlockFloat(1.2,3.4));
        
   
#pragma mark -------  给block 取别名---------
        //MaxNumber就代表一个类型
        typedef int (^TwoNumberOperation)(int,int);
        //定义一个MaxNumber类型的变量,变量指向Max这个block
        TwoNumberOperation maxNumber=Max;
        //相当于指针的重指向
//        maxNumber=MyBlock;
        NSLog(@"maxNumber=%d",maxNumber(9,1));
        
        //
        NSArray *arr = @[@"w",@"e",@"t"];
        //默认升序
        NSArray *arr1=[arr sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
            return [obj1 compare:obj2];
        }];
        NSLog(@"%@",arr1);
        
//        NSComparator
        //倒序
        NSArray *arr2=[arr sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
            return [obj2 compare:obj1];
        }];
        NSLog(@"%@",arr2);
        
        
        //求乘积
        
        int (^BlockMulti)(int,int)=^(int a,int b){
            return a*b;
        };
        int multi=BlockMulti(12,3);
        NSLog(@"12*3=%d",multi);
        //根据别名 定义一个变量 指向你想运行的那个Block块。
        TwoNumberOperation Multi=BlockMulti;
        int result1=Multi(29,2);
        NSLog(@"29*2=%d",result1);
        
        //使用嵌套--得到三个数中的最大值
        int (^BlockMaxOfThreeNumber)(int ,int ,int)=^ (int a,int b,int c){
            //嵌套调用前面一个block
            maxNumber(a,b);
            return maxNumber(a,b)>c?maxNumber(a,b):c;
        };
        int num1=23,num2=12,num3=25;
        NSLog(@"%d,%d,%d中的最大数:%d",num1,num2,num3,BlockMaxOfThreeNumber(num1,num2,num3));
   
//        block能存在全局区、栈区、堆区
#pragma mark ------ Block 与局部变量|全局变量-------------
        int number1=5;
        
        __block int number11=7;//为了防止外部局部变量被释放后,block块内在对这个变量进行修改时发生奔溃的情况。
        //两个下划线+block
        // __block是相当于拷贝了一个number,就相当于在外部局部变量number处也有另外一个__block的number,所以当在还没有调用block时,外部释放了number后,再在block中对number访问以及修改都是可以的。个人觉得就相当于使用了两个重名的名字,当一个名字被弃用了,另外一个名字也是可以的

        //无返回值无参数
        void (^numberBlock)()=^(){
            //对于block块外的局部变量,block内部可以访问,但是不能修改。
            //在block里面只能访问局部变量,不能进行修改值。
            number11++;
            NSLog(@"%d",number1);
            NSLog(@"block块内使用number11:%d",number11);
        };
        
        numberBlock();
        NSLog(@"调用了block后number11:%d",number11);
        
#pragma mark 排序
        
//        NSComparisonResult
        NSMutableArray *array1=[NSMutableArray array];
        [array1 addObject:@"11"];
        [array1 addObject:@"34"];
        [array1 addObject:@"9"];
        [array1 addObject:@"19"];
        [array1 addObject:@"89"];
        NSComparisonResult (^Aray)(id,id)=^(NSString *str1,NSString *str2){
            
//            if ([str1 compare:str2]==NSOrderedAscending) {
//                return NSOrderedAscending;
//            }else if ([str1 compare:str2]==NSOrderedDescending){
//                return NSOrderedDescending;
//            }else{
//                return NSOrderedSame;
//            }
            
            return [str1 compare:str2];
        };
        
        Aray([array1 objectAtIndex:1],[array1 objectAtIndex:4]);
        NSLog(@"%@",array1);
        
        
//        NSArray *array2=[array1 sortedArrayUsingComparator:^Aray(NSString *str1,NSString *str2) {
//            return [obj1 compare:obj2];
//        }];
//        
//        NSLog(@"%@",array2);
        
        
        Person *person1=[Person personName:@"bella" Gender:@"female" Age:22];
        Person *person2=[Person personName:@"jack" Gender:@"male" Age:23];
        Person *person3=[Person personName:@"jude" Gender:@"male" Age:34];
        Person *person4=[Person personName:@"jessca" Gender:@"female" Age:26];
        Person *person5=[Person personName:@"poppy" Gender:@"female" Age:6];
        [person1 setName:@"tiantian" Gender:@"female" Age:8];
        NSLog(@"person1:%@",person1);
        NSLog(@"person2:%@",person2);
        
        NSMutableArray *personArray=[[NSMutableArray alloc]initWithObjects:person1,person2,person3,person4,person5, nil];
        //根据名字排序--倒序
        [personArray sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
            return -[[obj1 name] compare:[obj2 name]];
        }];
        NSLog(@"姓名排序:%@",personArray);
        
        //根据年龄排序
        [personArray sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
            //我也是够了,明明自己定义的age是NSInteger的,结果刚刚却想成了NSString*,真是太傻太天真,自以为还非得转换成NSNuber才能比较,我真的是够够的了。
            NSNumber *num1=[[NSNumber alloc]initWithInteger:[obj1 age]];
            NSNumber *num2=[[NSNumber alloc]initWithInteger:[obj2 age]];
            //compare
            //- (NSComparisonResult)compare:(NSNumber *)otherNumber;
            return [num1 compare:num2];
        }];
        NSLog(@"年龄排序:%@",personArray);
        
#pragma mark  ---------字面量 ——-------------------
        //字符串字面量
        NSString *str1=@"hello girl";
        NSLog(@"%@",str1);
        //NSNumber中的字面量
        NSNumber *numberA=@10;//整型
        NSLog(@"%@",numberA);
        NSNumber *numberB=@3.14159f;
        NSLog(@"%@",numberB);
        //BOOL
        NSNumber *numberC=@YES;
        NSLog(@"%@",numberC);
        //字符
        NSNumber *numberD=@'a';
        NSLog(@"%@",numberD);
        //无符号整型
        NSNumber *numberE=@123ul;
        NSLog(@"%@",numberE);
        //数组
        NSArray *numberF=@[@1,@3,@13];
        NSLog(@"%@",numberF);
        
        NSDictionary *numberG=@{@7:@'h',@4:@'g'};
        NSLog(@"%@",numberG);
        
    }
    return 0;
}



#import <Foundation/Foundation.h>

@interface Person : NSObject
{
    NSString *_name;
    NSString *_gender;
    NSInteger _age;
}
-(id)initWithName:(NSString*)name Gender:(NSString*)gender Age:(NSInteger)age;
+(id)personName:(NSString*)name Gender:(NSString*)gender Age:(NSInteger)age;

-(void)setName:(NSString*)name Gender:(NSString*)gender Age:(NSInteger)age;
-(id)name;
-(id)gender;
-(NSInteger)age;
-(NSString *)description;


@end

==================================================================


#import "Person.h"

@implementation Person
-(id)initWithName:(NSString*)name Gender:(NSString*)gender Age:(NSInteger)age{
    self=[super init];
    if (self) {
        _name=name;
        _gender=gender;
        _age=age;
    }
    return self;
}
+(id)personName:(NSString*)name Gender:(NSString*)gender Age:(NSInteger)age{
    Person *person=[[Person alloc]initWithName:name Gender:gender Age:age];
    return person;
}

-(void)setName:(NSString*)name Gender:(NSString*)gender Age:(NSInteger)age{
    _name=name;
    _gender=gender;
    _age=age;
}
-(id)name{
    return _name;
}
-(id)gender{
    return _gender;
}
-(NSInteger)age{
    return _age;
}
-(NSString *)description{
    return [NSString stringWithFormat:@"%@,%@,%ld",_name,_gender,_age];
}
@end



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值