Objective_C_06

15/12/11
//  Objective_C_06

#import <Foundation/Foundation.h>
#import "Student.h"
#pragma mark-----函数指针回顾-----
//NSInteger sum (NSInteger a,NSInteger b){
//    return a + b;
//}
//void showmessage(NSInteger x,NSInteger y){
//    NSLog(@"%ld",sum(x,y));
//}
//
//int main(int argc, const char * argv[]) {
//    NSInteger (*p)(NSInteger ,NSInteger) = sum;
//    NSLog(@"%ld", p(5,3));
//    
//    void (*p1)(NSInteger ,NSInteger) = showmessage;
//    p1(5,6);
//    return 0;
//}

int goldOne;
int main(int argc, const char * argv[]) {
#pragma mark-----Block-----
    
//    ^:脱字符
//    定义一个实现相加的block
    int(^p)(int,int) = ^int(int x,int y){
        return x + y;
    };//-----分号不可少------
    NSLog(@"两个数相加为:%d",p(7,8));
    
//    int(^)(int,int)  block类型
//    p是block的变量名
//    ^int(int x,int y){return x + y;};匿名函数,作为block变量的值。注意:写之前要加“^”
//    定义一个实现相减的block
    float(^p1)(float,float) = ^float(float a,float b){return a - b;};
    NSLog(@"两个数相减为:%0.2f",p1(9,4));
    
//    写一个 返回值为整型 参数为NSString(仅⼀个参数)的block,实现将字符串转换为整型的功能。
    NSInteger(^p2)(NSString *) = ^NSInteger(NSString *s){return [s integerValue];};;
    NSLog(@"%ld", p2(@"152"));
    int(^intFromSting)(NSString *) = ^(NSString *s){return [s intValue];};;
    NSLog(@"%d", intFromSting(@"12"));
    
//    写一个block,有两个参数,一个是数组,一个是字符串,
//    判断数组中是否有此字符串,如果有,返回下标,没有返回-1
    NSArray *a = [[NSArray alloc] initWithObjects:@"shuju1",@"shuju2",@"shuju3", nil];
//    NSString *s1 = @"shuju2";
    NSString *s1 = @"shuju3";
    NSInteger(^getIndexOfStr)(NSArray *,NSString*) = ^NSInteger(NSArray *array,NSString *s){
        for (int i = 0; i < [array count]; i++) {
            if (s == [array objectAtIndex:i]) {
                return [array indexOfObject:s];
            }
        }
        return -1;
        };
    NSLog(@"%ld",getIndexOfStr(a,s1));
//
    NSInteger(^getIndexOfStr1)(NSArray *,NSString*) = ^NSInteger(NSArray *array,NSString *s){
        if ([array containsObject:s]) {
            return [array indexOfObject:s];
        }else{
            return -1;
        }
    };
    NSLog(@"%ld",getIndexOfStr1(a,s1));
//
//    typedef int(^MyBlock)(int,int);
//    MyBlock block1 = ^(int x,int y){
//        return x*y;
//    };
//    NSLog(@"%d",block1(4,5));
    
//    NSDictionary * area = [NSDictionary dictionaryWithObjectsAndKeys:@"西城区",@"name0",@"东城区",@"name1",@"朝阳区",@"name2", nil];
//    NSDictionary *are = [NSDictionary dictionaryWithObjectsAndKeys:@"西城区",@"name0",nil];
//    NSArray *areaarr = [NSArray arrayWithObject:area];
//    for (int i = 0; i < [areaarr count]; i++) {
//        if ([areaarr valueForKey:@"西城区"]) {
//            NSLog(@"查找到了");
//        }else{
//            NSLog(@"没有查找到了");
//        }
//    }
    
//    if ([area valueForKey:@"name0"]) {
//        NSLog(@"查找到了");
//    }else{
//        NSLog(@"没有查找到了");
//    }
    
    
//    NSString*(^p3)(NSInteger,NSInteger) = ^NSString*(NSInteger a,NSInteger b)
//    {
//        
//        return [NSStringWithFomat:@"%ld",a] + [NSStringWithFomat:@"%ld",b];
//    };
//    NSLog(@"%@", p3(15,45));
    
//    __block int multiple = 10;
//    int (^block)(int) = ^(int a){
//        multiple = 1;
//        goldOne = 2;
//        return a*multiple*goldOne;
//    };
//    NSLog(@"%d",block(2));
//    NSLog(@"%d",multiple);
//    在block内部,可以使用局部变量和全局变量的值
//    全局变量的值可以直接修改
//    局部变量的值要修改的话,需要在定义变量的时候添加__block(两个下划线)进行修饰
    
//    数组使用Block排序
    NSMutableArray *mutableArray = [NSMutableArray arrayWithObjects:@"123",@"152",@"452",@"442",@"45", nil];
//    NSLog(@"原数组:%@",mutableArray);
    [mutableArray sortUsingComparator:^NSComparisonResult(id obj1,id obj2){
        if ([obj1 intValue] > [obj2 intValue]) {
            return 1;
        }else{
            return 0;
        }
        return NSOrderedDescending;//1 反着打
        return NSOrderedSame;//0  正着打
        return NSOrderedAscending;//-1  /正着打
        
    }];
    NSLog(@"排序后数组:%@",mutableArray);//45,
//                                       123,
//                                       152,
//                                       442,
//                                       452
//   0 0 顺序不变  1 1 位置翻转
//   1 0 或 0 1 按if的判断条件排序{>  1 0 升序   0 1 降序}{< 1 0 降序 0 1升序 }
    
//    使用Block对Student对象排序
    Student *stu1 = [Student studentWithName:@"d" Age:20 Score:81.1];
    Student *stu2 = [Student studentWithName:@"a" Age:17 Score:98.5];
    Student *stu3 = [Student studentWithName:@"c" Age:14 Score:87.9];
    NSArray *studentArray = @[stu1,stu2,stu3];
//    NSLog(@"%@",studentArray);
////    使用普通方法排序
    studentArray = [studentArray sortedArrayUsingSelector:@selector(compareByAge:)];
    NSLog(@"%@",studentArray);
    
//    使用block方式排序
    studentArray = [studentArray sortedArrayUsingComparator:^NSComparisonResult(id obj1,id obj2) {
        if ([[obj1 Name] compare:[obj2 Name]] == NSOrderedAscending) {
            return YES;
        }
        return NO;
    }];
    NSLog(@"%@",studentArray);
    
    return 0;
}


//  Student.h
//  Objective_C_06

#import <Foundation/Foundation.h>

@interface Student : NSObject
{
    @protected
    NSString *_name;
    NSInteger _age;
    CGFloat _score;
}
- (id)initWithName:(NSString *)name
               Age:(NSInteger)age
             Score:(CGFloat)score;
- (void)setWithName:(NSString *)name
               Age:(NSInteger)age
             Score:(CGFloat)score;
+ (instancetype)studentWithName:(NSString *)name
                            Age:(NSInteger)age
                          Score:(CGFloat)score;
- (BOOL)compareByAge:(Student *)student;
- (NSString *)Name;
- (NSInteger)Age;
- (CGFloat)Score;
@end

//  Student.m
//  Objective_C_06

#import "Student.h"

@implementation Student
- (id)initWithName:(NSString *)name
               Age:(NSInteger)age
             Score:(CGFloat)score{
    if (self = [super init]) {
        _name = name;
        _age = age;
        _score = score;
    }
    return self;
}
- (void)setWithName:(NSString *)name
               Age:(NSInteger)age
              Score:(CGFloat)score{
    _name = name;
    _age = age;
    _score =score;
}
+ (instancetype)studentWithName:(NSString *)name
                            Age:(NSInteger)age
                          Score:(CGFloat)score{
    return [[Student alloc] initWithName:name Age:age Score:score];
}
- (BOOL)compareByAge:(Student *)student{
    if (_age > [student Age]) {
        return YES;
    }
    return NO;
}
/*
 1.description方法是NSObect自带的方法,包括对象方法和类方法
 2.+ (NSString *)description  默认返回类名
   - (NSString *)description  默认返回<类名:内存地址>
 3.默认情况下利用NSLog和%@输出对象时返回的就是类名和内存地址
 4.修改NSLog和%@的默认输出:重写类对象或实例对象的description方法。因为NSLog函数进行打印时会自动调用description
 */
//将字符串转化为对象输出,不然打印的时候打印的是地址
- (NSString *)description{
    return [NSString stringWithFormat:@"name:%@ age:%ld %0.2f",_name,_age,_score];
}
- (NSString *)Name{
    return _name;
}
- (NSInteger)Age{
    return _age;
}
- (CGFloat)Score{
    return _score;
}
@end

posted @ 2015-12-19 14:40  DH_Fantasy  阅读(81)  评论(0)    收藏  举报