您的位置:首页 > 其它

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

2014-08-12 18:54 465 查看
//
//  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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐