//
// 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;
}
block的定义和使用,以及block与数组排序
最新推荐文章于 2022-04-13 19:39:58 发布