NSNumber 、 NSValue 、 日期处理 、 集合类 、 NSArray(一)
1 基本数据类型的封装
1.1 问题
我们所学的所有基本数据类型,如int、float、double、char等,都不是对象,不能向它们发送消息。然而,在Foundation中的许多类,如NSArray,都要求使用对象作为其值,因此不能将任何基本数据类型直接存储到这些类的对象当中。要存储任何基本数据类型,都必须将这些数据封装成对象。
1.2 步骤
实现此案例需要按照如下步骤进行。
步骤一:封装整型数据
代码如下所示:
- #import <Foundation/Foundation.h>
- int main(int argc, const char * argv[])
- {
- @autoreleasepool {
- // insert code here...
- int i = 10;
- //装箱
- NSNumber* intNum = [NSNumber numberWithInt:i];
- //拆箱
- int i2 = [intNum intValue];
- NSLog(@"%d", i2);
- }
- return 0;
- }
在上述代码中,以下代码:
- int i = 10;
- //装箱
- NSNumber* intNum = [NSNumber numberWithInt:i];
将整型变量i封装成NSNumber类的对象,这一过程称为装箱。封装的过程是使用NSNumber类的方法numberWithInt,该方法带有一个实参,是要封装的整型变量。返回值是封装好的NSNumber类的对象。
在上述代码中,以下代码:
- //拆箱
- int i2 = [intNum intValue];
- NSLog(@"%d", i2);
是将封装了整型数据的NSNumber类对象还原成整型变量值,这一过程成为拆箱。使用NSNumber类的intValue方法,将NSNumber类对象中封装的整型数据还原。
步骤二:封装字符型数据
代码如下所示:
- #import <Foundation/Foundation.h>
- int main(int argc, const char * argv[])
- {
- @autoreleasepool {
- // insert code here...
- int i = 10;
- //装箱
- NSNumber* intNum = [NSNumber numberWithInt:i];
- //拆箱
- int i2 = [intNum intValue];
- NSLog(@"%d", i2);
- char c = 'a';
- //装箱
- NSNumber* charNum = [NSNumber numberWithChar:c];
- //拆箱
- char c2 = [charNum charValue];
- NSLog(@"%c", c2);
- }
- return 0;
- }
在上述代码中,以下代码:
- char c = 'a';
- //装箱
- NSNumber* charNum = [NSNumber numberWithChar:c];
将字符型变量c封装成NSNumber类的对象。封装的过程是使用NSNumber类的方法numberWithChar,该方法带有一个实参,是要封装的字符型变量。返回值是封装好的NSNumber类的对象。
在上述代码中,以下代码:
- //拆箱
- char c2 = [charNum charValue];
- NSLog(@"%c", c2);
是将封装了字符型数据的NSNumber类对象还原成字符型变量值。使用NSNumber类的charValue方法,将NSNumber类对象中封装的整型数据还原。
步骤三:封装单精度浮点型数据
代码如下所示:
- #import <Foundation/Foundation.h>
- int main(int argc, const char * argv[])
- {
- @autoreleasepool {
- // insert code here...
- int i = 10;
- //装箱
- NSNumber* intNum = [NSNumber numberWithInt:i];
- //拆箱
- int i2 = [intNum intValue];
- NSLog(@"%d", i2);
- char c = 'a';
- //装箱
- NSNumber* charNum = [NSNumber numberWithChar:c];
- //拆箱
- char c2 = [charNum charValue];
- NSLog(@"%c", c2);
- float f = 3.14f;
- //装箱
- NSNumber* floatNum = [NSNumber numberWithFloat:f];
- //拆箱
- float f2 = [floatNum floatValue];
- NSLog(@"%f", f2);
- }
- return 0;
- }
在上述代码中,以下代码:
- float f = 3.14f;
- //装箱
- NSNumber* floatNum = [NSNumber numberWithFloat:f];
将单精度浮点型变量f封装成NSNumber类的对象。封装的过程是使用NSNumber类的方法numberWithFloat,该方法带有一个实参,是要封装的单精度浮点型变量。返回值是封装好的NSNumber类的对象。
在上述代码中,以下代码:
- //拆箱
- float f2 = [floatNum floatValue];
- NSLog(@"%f", f2);
是将封装了单精度浮点型数据的NSNumber类对象还原成单精度浮点型变量值。使用NSNumber类的floatValue方法,将NSNumber类对象中封装的整型数据还原。
步骤四:封装双精度浮点型数据
代码如下所示:
- #import <Foundation/Foundation.h>
- int main(int argc, const char * argv[])
- {
- @autoreleasepool {
- // insert code here...
- int i = 10;
- //装箱
- NSNumber* intNum = [NSNumber numberWithInt:i];
- //拆箱
- int i2 = [intNum intValue];
- NSLog(@"%d", i2);
- char c = 'a';
- //装箱
- NSNumber* charNum = [NSNumber numberWithChar:c];
- //拆箱
- char c2 = [charNum charValue];
- NSLog(@"%c", c2);
- float f = 3.14f;
- //装箱
- NSNumber* floatNum = [NSNumber numberWithFloat:f];
- //拆箱
- float f2 = [floatNum floatValue];
- NSLog(@"%f", f2);
- double d = 3.1415926;
- //装箱
- NSNumber* doubleNum = [NSNumber numberWithDouble:d];
- //拆箱
- double d2 = [doubleNum doubleValue];
- NSLog(@"%lf", d2);
- }
- return 0;
- }
在上述代码中,以下代码:
- double d = 3.1415926;
- //装箱
- NSNumber* doubleNum = [NSNumber numberWithDouble:d];
将双精度浮点型变量d封装成NSNumber类的对象。封装的过程是使用NSNumber类的方法numberWithDouble,该方法带有一个实参,是要封装的双精度浮点型变量。返回值是封装好的NSNumber类的对象。
在上述代码中,以下代码:
- //拆箱
- double d2 = [doubleNum doubleValue];
- NSLog(@"%lf", d2);
是将封装了双精度浮点型数据的NSNumber类对象还原成双精度浮点型变量值。使用NSNumber类的doubleValue方法,将NSNumber类对象中封装的整型数据还原。
1.3 完整代码
本案例的完整代码如下:
- #import <Foundation/Foundation.h>
- int main(int argc, const char * argv[])
- {
- @autoreleasepool {
- // insert code here...
- int i = 10;
- //装箱
- NSNumber* intNum = [NSNumber numberWithInt:i];
- //拆箱
- int i2 = [intNum intValue];
- NSLog(@"%d", i2);
- char c = 'a';
- //装箱
- NSNumber* charNum = [NSNumber numberWithChar:c];
- //拆箱
- char c2 = [charNum charValue];
- NSLog(@"%c", c2);
- float f = 3.14f;
- //装箱
- NSNumber* floatNum = [NSNumber numberWithFloat:f];
- //拆箱
- float f2 = [floatNum floatValue];
- NSLog(@"%f", f2);
- double d = 3.1415926;
- //装箱
- NSNumber* doubleNum = [NSNumber numberWithDouble:d];
- //拆箱
- double d2 = [doubleNum doubleValue];
- NSLog(@"%lf", d2);
- }
- return 0;
- }
2 根据身份证号码求年龄
2.1 问题
身份证是公民用于证明持有人身份的证件
1984年4月,我国开始实行居民身份证制度,第一代居民身份证采用印刷和照相翻拍技术塑封而成,比较容易被伪造。
2003年6月,《中华人民共和国居民身份证法》规定居住在中华人民共和国境内的年满十六周岁的中国公民,应当申请领取居民身份证;未满十六周岁的中国公民,也可以依照本法的规定申请领取居民身份证。
2004年3月起我国正式开始为居民换发内藏非接触式IC卡智能芯片的第二代居民身份证,第二代身份证表面采用防伪膜和印刷防伪技术,使用个人彩色照片,而且内置了数字芯片,采用了数字防伪措施,存有个人图像和信息,可以用机器读取。十六周岁至二十五周岁的,发给有效期十年的居民身份证;二十六周岁至四十五周岁的,发给有效期二十年的居民身份证;四十六周岁以上的,发给长期有效的居民身份证;未满十六周岁的公民,自愿申请领取居民身份证的,发给有效期五年的居民身份证。
自2012年1月1日起,公民申请领取、换领、补领居民身份证,应当登记指纹信息。
2.2 方案
身份证上有一个18位的身份证号,这个号码依据《中华人民共和国国家标准 GB 11643-1999》是这样定义的,从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。出生日期码表示持证人出生的年、月、日。
依据以上的知识,截取身份证号码的出生日期码,在从中得到出生的年份值与今年相减就可以得到年龄。
2.3 步骤
实现此案例需要按照如下步骤进行。
步骤一:从控制台输入某人的身份证号
代码如下所示:
- #import <Foundation/Foundation.h>
- int main(int argc, const char * argv[])
- {
- @autoreleasepool {
- // insert code here...
- //从控制台输入一个身份证号
- char id[19] = {};
- NSLog(@"请输入身份证号:");
- scanf("%s", id);
- NSString *sid = [NSString stringWithCString:id encoding:NSASCIIStringEncoding];
- }
- return 0;
- }
上述代码中,以下代码:
- NSString *fileName = [NSString stringWithCString:name encoding:NSASCIIStringEncoding];
是使用NSString类的stringWithCString: encoding:方法,将字符数组name转换成NSString类的对象。stringWithCString: encoding:方法有两个实参,第一个实参是要转换的字符数组名;第二个实参为要转换字符数组的编码方式,对于char型数组,编码方式为NSASCIIStringEncoding。
步骤二:截取身份证中的年龄
代码如下所示:
- #import <Foundation/Foundation.h>
- int main(int argc, const char * argv[])
- {
- @autoreleasepool {
- // insert code here...
- //从控制台输入一个身份证号
- char id[19] = {};
- NSLog(@"请输入身份证号:");
- scanf("%s", id);
- NSString *sid = [NSString stringWithCString:id encoding:NSASCIIStringEncoding];
- //得到身份证号中的年龄
- NSRange ryear = {6,4};
- NSString* year = [sid substringWithRange:ryear];
- }
- return 0;
- }
上述代码中,以下代码:
- NSRange ryear = {6,4};
定义一个范围ryear,在本案例中这个范围的意义是,从身份证号码第7位开始,连续4个数字。程序中是6,因为字符串中的字符从0开始计算,所以到6时是第7位。
上述代码中,以下代码:
- NSString* year = [sid substringWithRange:ryear];
是截取身份证字符串指定范围内的数字,使用NSString类的substringWithRange方法实现,该方法带有一个实参ryear,是要截取身份证号码从第7位开始,连续4个数字,它们正好是持证人的出生年份值。
步骤三:获得当前日期
代码如下所示:
- #import <Foundation/Foundation.h>
- int main(int argc, const char * argv[])
- {
- @autoreleasepool {
- // insert code here...
- //从控制台输入一个身份证号
- char id[19] = {};
- NSLog(@"请输入身份证号:");
- scanf("%s", id);
- NSString *sid = [NSString stringWithCString:id encoding:NSASCIIStringEncoding];
- //得到身份证号中的年龄
- NSRange ryear = {6,4};
- NSString* year = [sid substringWithRange:ryear];
- //得到当前日期
- NSDate* now3 = [NSDate date];
- NSDateFormatter* format = [[NSDateFormatter alloc]init];
- format.dateFormat = @"yyyy";
- NSString* syear=[format stringFromDate:now3];
- }
- return 0;
- }
上述代码中,以下代码:
- NSDate* now3 = [NSDate date];
是获取当前日期值。类NSDate中存储着时间信息,通过工厂方法date,可以创建一个NSDate类的对象,该对象中是当前时间值。
上述代码中,以下代码:
- NSDateFormatter* format = [[NSDateFormatter alloc]init];
- format.dateFormat = @"yyyy";
定义一个日期模板对象format,然后使用该对象中的format.dateFormat属性指定日期的格式。
上述代码中,以下代码:
- NSString* syear=[format stringFromDate:now3];
是根据日期模板对象format的format.dateFormat日期格式属性,使用NSDateFormatter类的stringFromDate方法,获取对象now3中的当前年份,stringFromDate方法的返回值为NSString类的对象。
步骤四:将字符串类型转换成数值
代码如下所示:
- #import <Foundation/Foundation.h>
- int main(int argc, const char * argv[])
- {
- @autoreleasepool {
- // insert code here...
- //从控制台输入一个身份证号
- char id[19] = {};
- NSLog(@"请输入身份证号:");
- scanf("%s", id);
- NSString *sid = [NSString stringWithCString:id encoding:NSASCIIStringEncoding];
- //得到身份证号中的年龄
- NSRange ryear = {6,4};
- NSString* year = [sid substringWithRange:ryear];
- //得到当前日期
- NSDate* now3 = [NSDate date];
- NSDateFormatter* format = [[NSDateFormatter alloc]init];
- format.dateFormat = @"yyyy";
- NSString* syear=[format stringFromDate:now3];
- //将相应的字符串类型转换成数值
- int iyear2 = [year intValue];
- int syear2 = [syear intValue];
- }
- return 0;
- }
上述代码中,以下代码:
- int iyear2 = [year intValue];
- int syear2 = [syear intValue];
使用NSString类的方法intValue,将字符串中的数字字符转换成整型数值。
步骤五:计算年龄
代码如下所示:
- #import <Foundation/Foundation.h>
- int main(int argc, const char * argv[])
- {
- @autoreleasepool {
- // insert code here...
- //从控制台输入一个身份证号
- char id[19] = {};
- NSLog(@"请输入身份证号:");
- scanf("%s", id);
- NSString *sid = [NSString stringWithCString:id encoding:NSASCIIStringEncoding];
- //得到身份证号中的年龄
- NSRange ryear = {6,4};
- NSString* year = [sid substringWithRange:ryear];
- //得到当前日期
- NSDate* now3 = [NSDate date];
- NSDateFormatter* format = [[NSDateFormatter alloc]init];
- format.dateFormat = @"yyyy";
- NSString* syear=[format stringFromDate:now3];
- //将相应的字符串类型转换成数值
- int iyear2 = [year intValue];
- int syear2 = [syear intValue];
- //计算年龄
- int age = syear2-iyear2;
- NSLog(@"身份证:%@ ->年龄:%d",sid,age);
- }
- return 0;
- }
上述代码中,以下代码:
- int age = syear2-iyear2;
用今年的年份值减去身份证上的年份值,即可得到持证人的年龄。
2.4 完整代码
本案例的完整代码如下:
- #import <Foundation/Foundation.h>
- int main(int argc, const char * argv[])
- {
- @autoreleasepool {
- // insert code here...
- //从控制台输入一个身份证号
- char id[19] = {};
- NSLog(@"请输入身份证号:");
- scanf("%s", id);
- NSString *sid = [NSString stringWithCString:id encoding:NSASCIIStringEncoding];
- //得到身份证号中的年龄
- NSRange ryear = {6,4};
- NSString* year = [sid substringWithRange:ryear];
- //得到当前日期
- NSDate* now3 = [NSDate date];
- NSDateFormatter* format = [[NSDateFormatter alloc]init];
- format.dateFormat = @"yyyy";
- NSString* syear=[format stringFromDate:now3];
- //将相应的字符串类型转换成数值
- int iyear2 = [year intValue];
- int syear2 = [syear intValue];
- //计算年龄
- int age = syear2-iyear2;
- NSLog(@"身份证:%@ ->年龄:%d",sid,age);
- }
- return 0;
- }
3 向数组中存放数据
3.1 问题
现在有一些数据,它们是整型数据10、字符型数据‘a’、单精度浮点型数据10.1f和自定义类TRStudent的一个对象,将它们存放在数组NSArray中。
3.2 步骤
实现此案例需要按照如下步骤进行。
步骤一:将基本数据类型数据封装
代码如下所示:
- #import <Foundation/Foundation.h>
- int main(int argc, const char * argv[])
- {
- @autoreleasepool {
- // insert code here...
- //整型数据
- int i = 10;
- NSNumber* oi = [NSNumber numberWithInt:i];
- //字符型数据
- char c = 'a';
- NSNumber* oc = [NSNumber numberWithChar:c];
- //单精度浮点型数据
- float f = 10.1f;
- NSNumber* of = [NSNumber numberWithFloat:f];
- }
- return 0;
- }
步骤二:定义类TRStudent
首先,在Day02-3工程中新添加TRStudent.h文件,用于定义新的类TRStudent。
代码如下所示:
- #import <Foundation/Foundation.h>
- @interface TRStudent : NSObject
- @property(nonatomic,assign)int age;
- @property(nonatomic,copy)NSString* name;
- @end
在上述代码中,以下代码:
- @property(nonatomic,assign)int age;
- @property(nonatomic,copy)NSString* name;
在TRStudent类中定义了两个属性,一个是整型变量age,用于存储学生的年龄;另一个是NSString类的对象name,用于存储学生的姓名。
然后,在类TRStudent的实现部分,即在TRStudent.m文件中,重写description方法的实现,该方法用于在NSLog中用%@输出TRStudent类的对象值。
代码如下所示:
- #import "TRStudent.h"
- @implementation TRStudent
- -(NSString *)description{
- return [NSString stringWithFormat:@"name:%@ age:%d",self.name, self.age];
- }
- @end
步骤三:在主程序中创建TRStudent类的对象
代码如下所示:
- #import <Foundation/Foundation.h>
- #import "TRStudent.h"
- int main(int argc, const char * argv[])
- {
- @autoreleasepool {
- // insert code here...
- //整型数据
- int i = 10;
- NSNumber* oi = [NSNumber numberWithInt:i];
- //字符型数据
- char c = 'a';
- NSNumber* oc = [NSNumber numberWithChar:c];
- //单精度浮点型数据
- float f = 10.1f;
- NSNumber* of = [NSNumber numberWithFloat:f];
- //类TRSTudent
- TRStudent* stu = [[TRStudent alloc]init];
- stu.age = 18;
- stu.name = @"zhangsan";
- }
- return 0;
- }
步骤四:将数据存入数组
代码如下所示:
- #import <Foundation/Foundation.h>
- #import "TRStudent.h"
- int main(int argc, const char * argv[])
- {
- @autoreleasepool {
- // insert code here...
- //整型数据
- int i = 10;
- NSNumber* oi = [NSNumber numberWithInt:i];
- //字符型数据
- char c = 'a';
- NSNumber* oc = [NSNumber numberWithChar:c];
- //单精度浮点型数据
- float f = 10.1f;
- NSNumber* of = [NSNumber numberWithFloat:f];
- //类TRSTudent
- TRStudent* stu = [[TRStudent alloc]init];
- stu.age = 18;
- stu.name = @"zhangsan";
- //将以上数据存放在数组中
- NSArray* array4 = [NSArray arrayWithObjects:oi,oc,of,stu, nil];
- for (int i=0; i<[array4 count]; i++) {
- id obj = [array4 objectAtIndex:i];
- NSLog(@"obj:%@",obj);
- }
- }
- return 0;
- }
上述代码中,以下代码:
- NSArray* array4 = [NSArray arrayWithObjects:oi,oc,of,stu, nil];
是用前面生成的数据,创建NSArray类的对象array4。NSArray类的工厂方法arrayWithObjects:用于生成NSArray类的对象,实参是要放入数组的数据,值得注意的是在这些数据的最后需要加上nil,表示要放入的数据已经结束。
上述代码中,以下代码:
- for (int i=0; i<[array4 count]; i++) {
- id obj = [array4 objectAtIndex:i];
- NSLog(@"obj:%@",obj);
- }
是设置一个循环来遍历数组。NSArray类的方法count返回对象array4中的数组元素个数,在这里用于限定循环的次数。NSArray类的方法objectAtIndex:返回指定位置的数组元素值,实参i用于指定要返回哪个数组元素。因为数组中存储的是不同数据类型的数据,所以需要用id类型的指针来接收。最后,在NSLog中使用格式符%@来输出数组中的元素。%@专用于输出类的对象,该格式符在输出自定义类TRStudent时,会调用TRStudent类中重写的description方法。
3.3 完整代码
本案例中,类TRStudent声明,即TRStudent.h文件,完整代码如下所示:
- #import <Foundation/Foundation.h>
- @interface TRStudent : NSObject
- @property(nonatomic,assign)int age;
- @property(nonatomic,copy)NSString* name;
- @end
类TRStudent实现,即TRStudent.m文件,完整代码如下所示:
- #import "TRStudent.h"
- @implementation TRStudent
- -(NSString *)description{
- return [NSString stringWithFormat:@"name:%@ age:%d",self.name, self.age];
- }
- @end
主程序,即main.m,完整代码如下所示:
- #import <Foundation/Foundation.h>
- #import "TRStudent.h"
- int main(int argc, const char * argv[])
- {
- @autoreleasepool {
- // insert code here...
- //整型数据
- int i = 10;
- NSNumber* oi = [NSNumber numberWithInt:i];
- //字符型数据
- char c = 'a';
- NSNumber* oc = [NSNumber numberWithChar:c];
- //单精度浮点型数据
- float f = 10.1f;
- NSNumber* of = [NSNumber numberWithFloat:f];
- //类TRSTudent
- TRStudent* stu = [[TRStudent alloc]init];
- stu.age = 18;
- stu.name = @"zhangsan";
- //将以上数据存放在数组中
- NSArray* array4 = [NSArray arrayWithObjects:oi,oc,of,stu, nil];
- for (int i=0; i<[array4 count]; i++) {
- id obj = [array4 objectAtIndex:i];
- NSLog(@"obj:%@",obj);
- }
- }
- return 0;
- }
4 创建五个学生对象,按姓名排序。
4.1 问题
创建一个自定义类TRStudent,为该类生成五个对象。把这五个对象存入一个数组当中,然后按照姓名对五个对象进行排序。
4.2 步骤
实现此案例需要按照如下步骤进行。
步骤一:定义类TRStudent
首先,在Day02-4工程中新添加TRStudent.h文件,用于定义新的类TRStudent。
代码如下所示:
- #import <Foundation/Foundation.h>
- @interface TRStudent : NSObject
- @property(nonatomic,assign)int age;
- @property(nonatomic,copy)NSString* name;
- -(id)initWithAge:(int)age andName:(NSString*)name;
- //定义对象的比较规则
- -(NSComparisonResult)compare:(TRStudent*)otherStu;
- @end
在上述代码中,以下代码:
- @property(nonatomic,assign)int age;
- @property(nonatomic,copy)NSString* name;
在TRStudent类中定义了两个属性,一个是整型变量age,用于存储学生的年龄;另一个是NSString类的对象name,用于存储学生的姓名。
在上述代码中,以下代码:
- -(id)initWithAge:(int)age andName:(NSString*)name;
声明了TRStudent类的带参初始化函数。
在上述代码中,以下代码:
- //定义对象的比较规则
- -(NSComparisonResult)compare:(TRStudent*)otherStu;
声明了TRStudent类对象的比较规则方法,该方法用于当TRStudent类对象进行排序时,哪个对象在前,哪个对象在后的评判标准。
然后,在类TRStudent的实现部分,即在TRStudent.m文件中,实现了compare方法和带参初始化方法,重写description方法的实现。
代码如下所示:
- #import "TRStudent.h"
- @implementation TRStudent
- //按姓名排序
- -(NSComparisonResult)compare:(TRStudent*)otherStu{
- return [self.name compare:otherStu.name];
- }
- -(id)initWithAge:(int)age andName:(NSString*)name{
- self = [super init];
- if (self) {
- self.age = age;
- self.name = name;
- }
- return self;
- }
- -(NSString *)description{
- return [NSString stringWithFormat:@"student age:%d name:%@",self.age,self.name];
- }
- @end
上述代码中,以下代码:
- //按姓名排序
- -(NSComparisonResult)compare:(TRStudent*)otherStu{
- return [self.name compare:otherStu.name];
- }
是对比较规则方法的实现。在该方法中,有一个形参,传入的是另一个TRStudent类的对象,将该对象与当前对象进行比较。compare:方法有一个返回值,是NSComparisonResult类型的值,该类型的值只有三个,分别是NSOrderedAscending(升序排列)、NSOrderedSame(相等)、NSOrderedDescending(降序排列)。compare:方法的函数体内使用NSString类的compare:方法对两个TRStudent类的对象的name属性进行比较。
上述代码中,以下代码:
- -(id)initWithAge:(int)age andName:(NSString*)name{
- self = [super init];
- if (self) {
- self.age = age;
- self.name = name;
- }
- return self;
- }
是TRStudent类的带参初始化函数的实现。
上述代码中,以下代码:
- -(NSString *)description{
- return [NSString stringWithFormat:@"student age:%d name:%@",self.age,self.name];
- }
是重写description方法的实现,该方法用于在NSLog中用%@输出TRStudent类的对象值。
步骤二:在主程序中定义五个学生对象
代码如下所示:
- #import <Foundation/Foundation.h>
- #import "TRStudent.h"
- int main(int argc, const char * argv[])
- {
- @autoreleasepool {
- // insert code here...
- //定义五个对象
- TRStudent* stu = [[TRStudent alloc]initWithAge:18 andName:@"zhangsan"];
- TRStudent* stu2 = [[TRStudent alloc]initWithAge:21 andName:@"lisi"];
- TRStudent* stu3 = [[TRStudent alloc]initWithAge:20 andName:@"wangwu"];
- TRStudent* stu4 = [[TRStudent alloc]initWithAge:25 andName:@"zhaoliu"];
- TRStudent* stu5 = [[TRStudent alloc]initWithAge:23 andName:@"qianqi"];
- }
- return 0;
- }
步骤三:使用五个学生对象生成一个数组
代码如下所示:
- #import <Foundation/Foundation.h>
- #import "TRStudent.h"
- int main(int argc, const char * argv[])
- {
- @autoreleasepool {
- // insert code here...
- //定义五个对象
- TRStudent* stu = [[TRStudent alloc]initWithAge:18 andName:@"zhangsan"];
- TRStudent* stu2 = [[TRStudent alloc]initWithAge:21 andName:@"lisi"];
- TRStudent* stu3 = [[TRStudent alloc]initWithAge:20 andName:@"wangwu"];
- TRStudent* stu4 = [[TRStudent alloc]initWithAge:25 andName:@"zhaoliu"];
- TRStudent* stu5 = [[TRStudent alloc]initWithAge:23 andName:@"qianqi"];
- //生成数组
- NSArray* stus = @[stu,stu2,stu3,stu4,stu5];
- NSLog(@"stus:%@",stus);
- }
- return 0;
- }
上述代码中,以下代码:
- NSArray* stus = @[stu,stu2,stu3,stu4,stu5];
是iOS6.0以后定义的生成数组对象的简化方法。
步骤四:对五个学生对象进行排序
代码如下所示:
- #import <Foundation/Foundation.h>
- #import "TRStudent.h"
- int main(int argc, const char * argv[])
- {
- @autoreleasepool {
- // insert code here...
- //定义五个对象
- TRStudent* stu = [[TRStudent alloc]initWithAge:18 andName:@"zhangsan"];
- TRStudent* stu2 = [[TRStudent alloc]initWithAge:21 andName:@"lisi"];
- TRStudent* stu3 = [[TRStudent alloc]initWithAge:20 andName:@"wangwu"];
- TRStudent* stu4 = [[TRStudent alloc]initWithAge:25 andName:@"zhaoliu"];
- TRStudent* stu5 = [[TRStudent alloc]initWithAge:23 andName:@"qianqi"];
- //生成数组
- NSArray* stus = @[stu,stu2,stu3,stu4,stu5];
- NSLog(@"stus:%@",stus);
- //生成排序后的数组
- NSArray* stus2 = [stus sortedArrayUsingSelector:@selector(compare:)];
- NSLog(@"stus2:%@",stus2);
- }
- return 0;
- }
上述代码中,以下代码:
- NSArray* stus2 = [stus sortedArrayUsingSelector:@selector(compare:)];
是调用NSArray类中的sortedArrayUsingSelector方法对stus内的数组元素进行排序,将排序结果生成一个新的数组stus2。sortedArrayUsingSelector方法带有一个实参,是一个方法选择器,该方法选择器指定排序时的比较规则。在本案例中,排序比较规则采用TRStudent类中的compare方法。
4.3 完整代码
本案例中,类TRStudent声明,即TRStudent.h文件,完整代码如下所示:
- #import <Foundation/Foundation.h>
- @interface TRStudent : NSObject
- @property(nonatomic,assign)int age;
- @property(nonatomic,copy)NSString* name;
- -(id)initWithAge:(int)age andName:(NSString*)name;
- //定义对象的比较规则
- -(NSComparisonResult)compare:(TRStudent*)otherStu;
- @end
类TRStudent实现,即TRStudent.m文件,完整代码如下所示:
- #import "TRStudent.h"
- @implementation TRStudent
- //按姓名排序
- -(NSComparisonResult)compare:(TRStudent*)otherStu{
- return [self.name compare:otherStu.name];
- }
- -(id)initWithAge:(int)age andName:(NSString*)name{
- self = [super init];
- if (self) {
- self.age = age;
- self.name = name;
- }
- return self;
- }
- -(NSString *)description{
- return [NSString stringWithFormat:@"student age:%d name:%@",self.age,self.name];
- }
- @end
主程序,即main.m,完整代码如下所示:
- #import <Foundation/Foundation.h>
- #import "TRStudent.h"
- int main(int argc, const char * argv[])
- {
- @autoreleasepool {
- // insert code here...
- //定义五个对象
- TRStudent* stu = [[TRStudent alloc]initWithAge:18 andName:@"zhangsan"];
- TRStudent* stu2 = [[TRStudent alloc]initWithAge:21 andName:@"lisi"];
- TRStudent* stu3 = [[TRStudent alloc]initWithAge:20 andName:@"wangwu"];
- TRStudent* stu4 = [[TRStudent alloc]initWithAge:25 andName:@"zhaoliu"];
- TRStudent* stu5 = [[TRStudent alloc]initWithAge:23 andName:@"qianqi"];
- //生成数组
- NSArray* stus = @[stu,stu2,stu3,stu4,stu5];
- NSLog(@"stus:%@",stus);
- //生成排序后的数组
- NSArray* stus2 = [stus sortedArrayUsingSelector:@selector(compare:)];
- NSLog(@"stus2:%@",stus2);
- }
- return 0;
- }
NSNumber 、 NSValue 、 日期处理 、 集合类 、 NSArray(一)的更多相关文章
- 黑马程序员_ Objective-c 之Foundation之NSNumber ,NSValue, NSDate
Objective-c 之Foundation之NSNumber ,NSValue, NSDate 1.NSNumber具体用法如下: 在Objective-c中有int的数据类型,那为什么还要使用数 ...
- OC07 -- 迭代器/NSNumber/NSValue/NSRange/NSSet/NSDate 及相互转换.(杂)
//一: 迭代器 //数组 NSArray *arr=@[@"1",@"2",@"3",@"4",@"5&qu ...
- 数值类对象:NSNumber,NSValue,NSNull
基本,集合,复杂,对象 可用对象封装基本数值,然后将对象放入NSArray或NSDictionary 中. 用对象封装基本数值后,即可给其发送消息. 数值类型包括:NSNumber,NSValue,N ...
- Object-c学习之路十(NSNumber&NSValue)
// // main.m // NSNumberAndNSValue // // Created by WildCat on 13-7-26. // Copyright (c) 2013年 wildc ...
- OC NSNumber NSValue
OC NSNumber NSValue iOS的集合对象不可以存储C语言基本类型,所有可以进行装箱和拆箱,来进行OC对象操作. NSNumber包装类 普通初始化 NSNumber * num1 = ...
- 02-Foundation-NSMutableString、NSNumber、NSValue、NSDate、NSArray
目录: 一.NSMutableString可变字符串 二.NSNumber数字对象 三.NSValue 四.NSDate日期对象 五.NSArray数组对象 回到顶部 一.NSMutableStrin ...
- NSNumber,NSValue和NSData
我们在编码中,很多时候需要将C里面原生的数据封装成对象,这样可以用NSDictionary或者NSArray来存取访问.尤其是一些做适配的情况下,这种封装是不可避免的.Objective-C提供了不少 ...
- 【IOS 开发】Objective-C Foundation 框架 -- 字符串 | 日期 | 对象复制 | NSArray | NSSet | NSDictionary | 谓词
一. 字符串 API 1. NSString 用法简介 (1) NSString API 介绍 NSString 功能 : -- 创建字符串 : 使用 init 开头的实例方法, 也可以使用 Stri ...
- Foundation框架下的常用类(NSNumber, NSValue, NSDate,NSDateFormatter)
1.NSNumber 将基础数类型数据转成对象数据(比如int float double BOOL long等等) //通过NSNumber将基础数类型数据转成对象数据. NSNumber * i ...
- iOS学习14之OC NSNumber + NSValue
1.NSNumber 数值类. 作用:实现基本数据类型与OC对象类型的相互转化. 1> NSNumber创建对象 // 初始化方法 NSNumber *num1 = [[NSNumber all ...
随机推荐
- (巨坑)改了tpl文件之后,前端效果没反应
通常前端修改很小的部分代码,并不会立即显示出效果.比如,原来是 ,修改后是 虽然只是加多了一个函数,但是作用很大,这种情况下,可能是由于浏览器缓存的原因,修改后的代码没有被重新加载.这个时候,只需要在 ...
- 将windows下的PLSQL转移到Ubuntu上
1,首先下载安装wine,安装不成功的更新下源即可. 2,Ctal+Alt+T 打开控制台: cd ~/.wine/drive_c mkdir -p oracle/bin mkdir -p oracl ...
- spring的bean管理
1.所有的类都可以交给Spring管理 2.如何把一个类交给bean管理? (1)配置applicationContext.xml (2)在xml中写入bean节点配置要交给bean管理的类 3.程序 ...
- ASP.NET MVC统一异常处理
前言: 今早看了篇文章:求知成瘾,却无作品 的思考:很有感触,发现原来自己也是这样,对每样东西都抱有很大的兴趣或者希望自己去学,一年后发现原来自己什么都是皮毛什么都不精!最终发现真正的大牛都是在某一个 ...
- libpcap文件格式分析
第一部分:PCAP包文件格式 一 基本格式: 文件头 数据包头数据报数据包头数据报...... 二.文件头: 文件头结构体 sturct pcap_file_header { DWOR ...
- Winform在一个窗体获取其他窗体的值
比如:Form2获取Form1 的label的值 因为默认的窗体的所有控件属性和方法都是private, Form1 form1 = new Form1(); 这样也是获取不到的 方法一.最简单的 将 ...
- http://www.html-js.com/article/2328
React.js编程思想 张小俊128 发布在使用React.js开发web应用2015年8月7日view:33385React 在文章任何区域双击击即可给文章添加[评注]!浮到评注点上可以查看详情. ...
- 飞天诚信usb-key登录windows+远程桌面
最近在尝试用智能卡做身份验证,以飞天诚信的ePass3000为例. 1.网络环境搭建: 用3台虚机+1台实体机搭一个单独的测试网段:172.16.188.x,如下: 机器名 IP 操作系统 作用 do ...
- POJ 1741 树上的点分治
题目大意: 找到树上点对间距离不大于K的点对数 这是一道简单的练习点分治的题,注意的是为了防止点分治时出现最后分治出来一颗子树为一条直线,所以用递归的方法求出最合适的root点 #include &l ...
- Hibernate对象映射类型
Hibernate understands both the Java and JDBC representations of application data. The ability to rea ...