码迷,mamicode.com
首页 > 编程语言 > 详细

Objective-C----Block 、数组排序

时间:2015-06-20 10:35:04      阅读:120      评论:0      收藏:0      [点我收藏+]

标签: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-C----Block 、数组排序

标签:objective   block   数组排序   oc   objetive-c   

原文地址:http://blog.csdn.net/zhengang007/article/details/46572169

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!