标签:objective block 数组排序 oc objetive-c
//写?一个 返回值为整型 参数为NSString(仅?一个参
// 数)的block,实现将字符串转换为整型的功能。
// int (NSString *string) {
// return [string intValue] ;
// }
// 把^int (NSString *string)赋值给int (^myBlock)(NSString *)
// ^int (NSString *string)是一个参数为NSString *类型、返回值为int类型的匿名函数
// 可定义在main()函数外面
// block的数据类型代表了匿名函数的格式(返回值类型,形参类型)
// block变量的定义与函数指针变量的定义类似,唯一区别于函数指针变量的是变量名前通过脱字符‘ ^ ’修饰。
// 首先应该用 ^ 修饰,剩余的部分与C语言函数定义一致,最大的不同就是没有函数名(同时返回值类型也可以省略)
// block变量在定义时具有变量定义的基本特征,赋值号右侧的匿名函数可以当做一个整体被赋值,类似于 int a = 5 ;
// block变量所赋值的值是匿名函数,又兼具函数的特征,并且是唯一可以定义在某个函数实现内部的(C语言中认为函数是不能嵌套定义的,block是个特例)
int (^myBlock)(NSString *) = ^int (NSString *string) {
return [string intValue] ;
} ;
NSLog( @"%d", myBlock(@"123") + 1 ) ;
// int (^sumBlock)( int, int ) = ^( int number1, int number2) 这样也OK
int (^sumBlock)( int, int ) = ^int ( int number1, int number2) {
return number1 + number2 ;
} ;
NSLog( @"%d", sumBlock( sumBlock( 1, 2), sumBlock( 3, 4 ) ) ) ;
// 类比函数指针的类型定义,格式与函数指针一致,类型定义一定程度上简化了block的使用
// typedef int (^BlockType)( int, int ) ;
BlockType sum = ^int ( int n, int m ) {
return m + n ;
} ;
NSLog( @"%d", sum( 2, 3) ) ;
// __block表示其所定义的变量可以在block函数体内使用;
// __block类型标示符可以允许局部变量在其后续定义的block内部正常访问
// (注意:把__block int count = 0 ;不能定义在__block函数体后面)
__block int count = 8 ;
void (^testBlock)() = ^() {
// int count = 9 ;
// __block int count = 6 ; // XXXX cuo wu
for (int i = 0; i < 10; i++ ) {
count++ ;
NSLog( @"%d", count ) ;
}
} ;
// __block int count = 8 ;
// NSLog( @"%d", count ) ;
//block调用
testBlock() ;
NSComparisonResult (^comareResult)(NSString *, NSString *) = ^(NSString * str1, NSString *str2) {
return [str1 compare:str2] ;
} ;
NSLog( @"%ld", comareResult( @"456", @"123") ) ;
/*
* 数组排序
*/
NSArray *array= @[@1, @3, @2, @5, @4] ;
NSArray *resultArray1 = [array sortedArrayUsingSelector:@selector(compare:)] ;
NSLog( @"%@", resultArray1 ) ;
__block int number = 0 ;
NSComparator sortBlock = ^( id obj1, id obj2 ) {
number++;
return [obj2 compare:obj1] ;
} ;
NSLog( @"%d", number ) ;//先执行
NSArray *resultArray2 = [array sortedArrayUsingComparator:sortBlock] ;
NSLog( @"%d", number ) ;
NSLog( @"%@", resultArray2 ) ;
//也可以这么写
//NSArray *resultArray3 = [array sortedArrayUsingComparator:^(id obj1, id obj2)
NSArray *resultArray3 = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
return [obj2 compare:obj1] ;
}] ;
NSLog( @"%@", resultArray3 ) ;
/*
* 练习二、
*
* 对上例数组
* 1、按学号升序排列
* 2、按学号降序排列
* 3、按姓名升序排列
* 4、按姓名降序排列
*/
Student *stu1 = [Student studentWithName:@"wang" number:1001 age:23] ;
Student *stu2 = [Student studentWithName:@"zhen" number:1003 age:22] ;
Student *stu3 = [Student studentWithName:@"gang" number:1002 age:24] ;
NSArray *strArray = [[NSArray alloc] initWithObjects:stu1, stu2, stu3, nil] ;
NSLog( @"%@", [strArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
return [[obj1 getName] compare:[obj2 getName]] ;
}] ) ;
NSLog( @"%@", [strArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
return [[NSString stringWithFormat:@"%d", [obj1 getNumber]] compare:[NSString stringWithFormat:@"%d", [obj2 getNumber]]] ;
}] ) ;
NSLog( @"%@", [strArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
return [[NSString stringWithFormat:@"%d", [obj1 getAge]] compare:[NSString stringWithFormat:@"%d", [obj2 getAge]]] ;
}] ) ;
NSMutableArray *stus = [NSMutableArray array] ;
NSArray *names = @[@"Duke", @"Douglas", @"Allen", @"Lily", @"Lucy", @"Jack", @"Rose", @"Jeams", @"Tom", @"Frank"] ;
for ( int i = 0; i < 10; i++ ) {
Student *stu = [Student studentWithName:names[i] number:arc4random() % 9000 + 1000 age:arc4random() % 100] ;
[stus addObject:stu] ;
}
NSLog( @"%@", stus ) ;
//注意:区别:[strArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2)
[stus sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
// return [[obj1 getName] compare:[obj2 getName]] ;
NSInteger age1 = [obj1 getAge] ;
NSInteger age2 = [obj2 getAge] ;
if (age1 < age2) {
return NSOrderedDescending ;
}
else if (age1 > age2) {
return NSOrderedAscending ;
}
return NSOrderedSame ;
}] ;
NSLog(@"%@",stus) ;
Student.h 文件:
//
// Student.h
//
// Created by on 15/4/7.
// Copyright (c) 2015年 . All rights reserved.
//
#import <Foundation/Foundation.h>
@interface Student : NSObject
{
NSString *_name ; // 姓名
int _number ; // 学号
int _age ; // 年龄
@protected
NSString *_a ;
@private
NSString *_b ;
}
- (instancetype)initWithName:(NSString *)name
number:(int)number
age:(int)age ;
+ (instancetype)studentWithName:(NSString *)name
number:(int)number
age:(int)age ;
- (NSString *)getName ;
- (int)getNumber ;
- (int)getAge ;
@end // Student
Student.m 文件:
//
// Student.m
//
// Created by on 15/4/7.
// Copyright (c) 2015年 . All rights reserved.
//
#import "Student.h"
@implementation Student
- (instancetype)initWithName:(NSString *)name
number:(int)number
age:(int)age {
if ( self = [super init] ) {
_name = name ;
_number = number ;
_age = age ;
}
return self ;
}
+ (instancetype)studentWithName:(NSString *)name
number:(int)number
age:(int)age {
return [[Student alloc] initWithName:name number:number age:age] ;
}
- (NSString *)getName {
return _name ;
}
- (int)getNumber {
return _number ;
}
- (int)getAge {
return _age ;
}
- (NSString *)description {
return [[NSString alloc] initWithFormat:@"%@ %d %d", _name , _number , _age ] ;
}
@end // Student
标签:objective block 数组排序 oc objetive-c
原文地址:http://blog.csdn.net/zhengang007/article/details/46572169