block的定义和使用,以及block与数组排序

//
//  main.m
//  89_oc_classexam
//
//  Created by Quan.Zh. on 14-8-9.
//  Copyright (c) 2014年 蓝鸥科技. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Student.h"
// 声明一个求和的函数
int sum(int a, int b);
int sum(int a, int b)
{
    int sum;
    sum = a + b;
    return sum;
}
// 给函数类型起别名
typedef int (*SUM) (int, int);

// 给block起别名
typedef int (^MyBlock) (int, int);





int main(int argc, const char * argv[])
{

    @autoreleasepool {
        
#pragma mark block的定义、使用、block与变量的关系

        // 写一个函数指针指向sum函数
        // 指针的类型:int (*) (inr,int)
        // 变量名:p
        // 值:sum
        int (*p) (int, int) = sum;
        sum (19,20);
        p (12,33);
        
        
        
        
// 声明一个block变量
        // 类型:int (^) (int,int)
        // 变量名:myBlock
        int (^myBlock) (int, int);
        // block的值
        myBlock = ^(int a, int b) { // ^标志着后边内容是一个block类型的
            return a+b;
        };
        // 返回值是int,
        // 参数是int,int
        
        
        
        // 定义三个block,实现:求差、商、积
        int (^dilBlock) (int, int);
        dilBlock = ^(int a, int b) {
            return a - b;
        };
        // block的简化写法1
        int (^shangBlock) (int, int) = ^(int a, int b) {
            return a / b;
        };

        // block的简便写法2:typedef
        
        int (^jiBlock) (int, int);
        jiBlock = ^(int a, int b) {
            return a * b;
        };
        
        // 使用别名定义一个block
        MyBlock moBlock = ^(int a, int b) {
            return a % b;
        };
        
        
// block的使用和函数指针一样,在变量名后直接传递参数值
        int a = 10, b = 20;
        NSLog(@"积 = %d", jiBlock(a, b));
        NSLog(@"差 = %d", dilBlock(a, b));
        NSLog(@"商 = %d", shangBlock(a,b));
        NSLog(@"和 = %d", myBlock(a,b));
        NSLog(@"摸 = %d", moBlock(a, b));
        
        
        
#pragma mark block与局部变量和全局变量的关系
// block对局部变量的修改值操作,需要在局部变量前添加__block修饰
// block对全局变量的修改,可以直接修改值
        // block内部公用的变量可以在block之外统一定义,如:
        int beishu = 10;    //  定义一个局部变量
        
        MyBlock myBlock1 = ^(int a, int b) {
            return (a + b) *beishu;
        };
        
        
        
        //  block内部可以调用局部变量,但是在block内部更改局部变量的值时,局部变量需要用__block修饰
        __block int beishu1 = 10;   //  定义一个__block修饰的局部变量
        
        MyBlock myBlock2 = ^(int a, int b) {
            beishu1 = 100;  // 经过修饰的beishu1可以修改
//            beishu = 100;   // 未经__block修饰的beishu不可以修改值
            
            return (a + b) * beishu1;
        };
        
        


        
#pragma mark block与数组排序

        NSArray *array = @[@"123", @"23", @"54", @"345"];
    
        NSComparisonResult (^sortArray) (id, id) = ^(id obj1, id obj2){
            // 根据数值大小进行排序,首先要将字符串转化为整型类型
            int i1 = [obj1 intValue];
            int i2 = [obj2 intValue];
            // 比较并返回两个值的大小
            if (i1 > i2) {
                return NSOrderedAscending;
            } else if (i1 < i2) {
                return NSOrderedDescending;
            }
                return NSOrderedSame;
            
        };
       // 把刚刚写的block作为参数,传递给sortedArrayUsingComparator:方法,让数组根据我们写的block进行排序
        array = [array sortedArrayUsingComparator:sortArray];
        // 打印结果
        NSLog(@"%@",array);
        }
    

        
        
        
        
#pragma mark 给学生按照姓名和年龄排序(使用block)
        
       // 初始化并创建一个学生对象
        Student *stu1 = [[Student alloc] initWithNmae:@"Z三" age:24];
        Student *stu2 = [[Student alloc] initWithNmae:@"L斯" age:23];
        Student *stu3 = [[Student alloc] initWithNmae:@"W五" age:12];
        Student *stu4 = [[Student alloc] initWithNmae:@"ZH刘" age:44];
        // 将学生装进数组中
        NSArray *stuArray = [NSArray arrayWithObjects:stu1,stu2,stu3,stu4,nil];
        // 定义一个排序的block
        // 根据姓名排序
        NSComparisonResult (^paixuByName) (id, id);
        paixuByName = ^(id obj1, id obj2) {
            if ([[obj1 getName] compare:[obj2 getName]] > 0) {
                return NSOrderedAscending;
            } else if ([[obj1 getName] compare:[obj2 getName]] < 0) {
                return NSOrderedDescending;
            } else
                return NSOrderedSame;
        };
        
        // 将上边定义的stuArray数组放在以下方法中,同时引用paixuByName,根据我们写的方法进行排序
        stuArray = [stuArray sortedArrayUsingComparator:paixuByName];
        for (int i = 0; i < stuArray.count; i++) {
             NSLog(@"%@",stuArray[i]);
        }
        
        // 根据年龄从小到大的排序
        NSLog(@"按照年龄升序排序");
        NSComparisonResult (^paixuByAge) (id, id);
        
        paixuByAge = ^(id obj1, id obj2) {
            if ([obj1 getAge] > [obj2 getAge]) {
                return NSOrderedDescending;
            } else if ([obj1 getAge] < [obj2 getAge]) {
                return NSOrderedAscending;
            }
            return NSOrderedSame;
        };
        
        stuArray = [stuArray sortedArrayUsingComparator:paixuByAge];
        for (int i = 0; i < stuArray.count; i++) {
            NSLog(@"%@",stuArray[i]);
            }
        
//************************************************************************************************//
        // 使用block排序的常用简便写法(block其实就是一个参数):选中参数按回车,系统自动生成block的实现头;
        stuArray = [stuArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
            if ([obj1 getAge] > [obj2 getAge]) {    // 排序代码
                return NSOrderedDescending;
            } else if ([obj1 getAge] < [obj2 getAge]) {
                return NSOrderedAscending;
            }
            return NSOrderedSame;

        }];
        for (int i = 0; i < stuArray.count; i++) {
            NSLog(@"@@@@@@@@@@@@@%@",stuArray[i]);
        }

//***********************************************************************************************//
        
        }
    return 0;

    }


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值