随意细解:OC -- 类的扩展

来源:互联网 发布:虚拟商品自动发货源码 编辑:程序博客网 时间:2024/05/16 04:59

用到的Person类为基本的功能,这里就不写了


#import <Foundation/Foundation.h>

#import "Person.h"


// 两个数的和的函数

int sumValue(int a ,int b)

{

    return a + b;

}


// block作为参数体现优势

// 实现两个数的加减乘除

int resultTwoNumber1(int num1 ,int num2,int (^block)(int a ,int b))

{

   return block(num1, num2);

}


typedef NSComparisonResult (^DJCompareBlock)(id obj1,id obj2);




// 声明全局变量

int value = 10;






int main(int argc,constchar * argv[]) {

    

    

  int ra =resultTwoNumber1(15,3, ^int(int a,int b) {

      return a / b;

  });


    

    int (*p)(int a ,int b) =NULL;

    p = sumValue;

    // 函数指针调用

    printf("%d\n",p(3,5));

    

    // Block标志 ^托字符(凸起符)

    // Block 保存的是有特定功能的函数体

    // 数据类型 +变量名初值

    // int (^变量名)(int a , int b)初值(跟前面的类型要一致)

    // 初值的部分是一个没有名字的函数体

    

    int (^Block)(int a ,int b) = ^int (int a ,int b)

    {

        return a + b;

    };

    int result = Block(2,3);

    NSLog(@"%d",result);

    

    // 打印参数的block OC

    // 无返回值void

    

    void (^PrintfBlock)(NSString *str) = ^void (NSString *str)

    {

        NSLog(@"%@",str);

    };

    

    // block调用直接使用block的名字去调用

    PrintfBlock(@"哈哈");

    // block类型  NSInteger (^)(NSString *str)

    // block  change

    // block的值 匿名的函数并且类型与block类型相同 ^NSInteger (NSString *str){ return [str intValue]; };

    // 匿名函数是函数其函数中定义的便两个存在栈区

    

    NSInteger (^change)(NSString *str) = ^NSInteger (NSString *str)

    {

       return [strintValue];

    };

    NSInteger result1 = change(@"2");

    NSLog(@"%ld",result1);

    

    NSInteger (^sumValue)(NSInteger a,NSInteger b) = ^NSInteger (NSInteger a,NSInteger b){

        return a + b;

    };

    

    NSLog(@"%ld", sumValue(2,3));

    

    NSInteger (^subValue)(NSInteger a,NSInteger b) = ^NSInteger (NSInteger a,NSInteger b){

        return a - b;

    };

    

    NSLog(@"%ld", subValue(5,3));

    

    


   // block的好处

   // 当把Block当做一个参数传入方法中

   // 非常的灵活可以灵活的掌控block的实现

   // 也就是你传入的block实现的是什么功能你这个方法就实现什么功能

    

    // block排序

    // 实现原理:数组中两个元素进行比较

    // 比较后返回值如果前面比后面大则交换

    // 经此比较到最后一个元素完成排序

    

    // compare:可以比较的类型:

    // 1.字符串类型(NSString *

    // 2.NSNumber * 类型

    

    NSMutableArray *array = [NSMutableArrayarrayWithObjects:@11,@8,@9,@12,nil];

    

    NSNumber *n1 = [NSNumbernumberWithInt:11];

    // 语法糖初始化NSNumber类型方法

    NSNumber *n2 =@11;

    

    

    DJCompareBlock block = ^NSComparisonResult (id obj1,id obj2){

        // 先确定类型

        NSNumber *num1 = (NSNumber *)obj1;

        NSNumber *num2 = (NSNumber *)obj2;

        

        // 根据类型确定升序还是降序

        if ([num1compare:num2] >0) {

            returnNSOrderedDescending;

        }elseif ([num1compare:num2] ==0){

            returnNSOrderedSame;

        }else{

            returnNSOrderedAscending;

        }

        

    };

    

    // 需要什么类型就给什么类型

    [array sortUsingComparator:block];

        

    Person *p1 = [[Personalloc]initWithName:@"Dajun" Age:22];

    Person *p2 = [[Personalloc]initWithName:@"Mtt" Age:25];

    Person *p3 = [[Personalloc]initWithName:@"QQ" Age:23];

    Person *p4 = [[Personalloc]initWithName:@"WW" Age:21];

    Person *p5 = [[Personalloc]initWithName:@"SS" Age:22];

    

    NSMutableArray *arr = [NSMutableArrayarrayWithObjects:p1, p2, p3 ,p4, p5,nil];

    

    

    // 按姓名排序

    [arr sortUsingComparator:^NSComparisonResult(id obj1,id obj2) {

        // 确定类型

        Person *p1 = obj1;

        Person *p2 = obj2;

        // 姓名升序降序

        if ([p1.namecompare:p2.name] >0) {

            returnNSOrderedDescending;

        }elseif ([p1.namecompare:p2.name] ==0){

            returnNSOrderedSame;

        }else{

            returnNSOrderedAscending;

        }

        

    }];

    

    NSLog(@"%@",arr);

    

    // 按年龄排序

    [arr sortUsingComparator:^NSComparisonResult(id obj1,id obj2) {

        // 确定类型

        Person *p1 = obj1;

        Person *p2 = obj2;

        if (p1.age > p2.age) {

            returnNSOrderedDescending;

        }elseif (p1.age == p2.age){

            returnNSOrderedSame;

        }else{

            returnNSOrderedAscending;

        }

    }];



     NSLog(@"%@",arr);

    

    // 字面量的使用(语法糖)

    // 切记:字面量使用的初始化方法是类方法初始化

    NSArray *array1 = [NSArrayarrayWithObjects:@"1",@"2",nil];

    // 相当于

    NSArray *arrayN =@[@"1",@"2"];

    // 取出一个元素

    [arrayN objectAtIndex:0];

    // 相当于

  //  arrayN[0];

    

    

    // Block类型起别名

    


    NSLog(@"%@",arr);

    

    

   __blockint num =5;

    

    BOOL (^myBlock)(NSString *str1,NSString *str2) = ^BOOL (NSString *str1,NSString *str2){

        // Block的实现(值)中直接修改局部变量是不行的,需要添加关键字(声明时) __block才能修改

        num = 100;

        NSLog(@"%d",num);

        // block的实现(值)中,可以直接修改全局变量不需要添加关键字

        value =200;

        NSLog(@"%d",value);

       

        return [str1isEqualToString:str2];

    };

    

    NSLog(@"%d", myBlock(@"abc",@"abc"));

    

    return0;

}

0 0
原创粉丝点击