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

浙公网安备 33010602011771号