Foundation框架中的数据类型
一、一些有用的数据类型
NSRange范围
typedef struct _NSRange{ unsigned int location; unsigned int length; }NSRange;
unsigned int是C语言中的int类型
location用来存放字段范围的起始位置,length是该范围内所含元素的个数
字符串”Objective-C is a cool language”中cool的location为17,length为4
三种赋值方式:
(1)
NSRange range; range.location = 17; range.length = 4;
(2)
NSRange range = {17,4};
(3)
NSRange range = NSMakeRange(17,4);
可以在方法调用中传递参数
[anObject flarbulateWithRange: NSMakeRange(13,15)];
几何数据类型
NSPoint笛卡儿平面中的坐标点(x,y)
typedef struct _NSPoint{ float x; float y; }NSPoint;
快捷函数:NSMakePoint()
NSSize用来存储长度和宽度
typedef struct _NSSize{ float width; float height; }NSSize;
快捷函数:NSMakeSize()
NSRect矩形数据类型
typedef struct _NSRect{ NSPoint origin; NSSize size; }NSRect;
快捷函数:NSMakeRect();
二、字符串NSString类
NSString类,其字符串以@开头,例@”Hello World”
格式化字符串
stringWithFormat方法
+(id) stringWithFormat(NSString *)format,….
最后的….表示这个方法可以接收多个逗号隔开的其他参数
+(id)表示这个方法属于类对象不属于类的实例对象,类方法可以访问全局数据
(-)声明的方法是实例方法,在实例对象中运行
例:
NSString *height; height = [NSString stringWithFormat:@”Your height is %d feed. %d incheds”,5,11];
字符串长度
length方法
-(unsigned int) length;
例
unsigned int length = [height length];
在表达式中使用
if([height length] > 35){ NSLog(@”wow,you’re really tall!!”); }
字符串比较方法
isEqualToString方法可以用来比较接收方(接收消息的对象)和当做参数传递来的字符串,返回BOOL值
例:
-(BOOL)isEqualToString:(NSString *)aString; NSString *thing1 = @”hello”; NSString *thing2 = @”hello”; if([thing1 isEqualToString: thing2]){ NSLog(@”They are the same”); }
compare方法,将接收对象和传递来的字符串逐个字符进行比较,返回一个NSComparisonResult(枚举型数据),是区分大小写的比较
typedef enum _NSComparisonResult{ NSOrderedAscending = -1, NSOrderedSame, NSOrderedDescending } NSComparisonResult;
例:
[@”aardvark” compare: @” zoinks”] 返回NSOrderedAscending [@”zoinks” compare: @”jinkies”] 返回NSOrderedDescending [@”fnord” compare:@”fnord”] 返回NSOrderedSame
不区分大小写的参数
-(NSComparisonResult) compare: (NSString)string options(unsigned)mask;
options参数是一个位掩码,可以使用位或|来添加选项标记
例:
if([thing1 compare :thing2 option : NSCaseInsensitiveSearch | NSNumericSearch] == NSOrderedSame) { NSLog(@"is Match"); }
字符串检索
-(BOOL)hasPrefix:(NSString *) aString; //检查字符串是否以另一个字符串开头 -(BOOL)hasSuffix:(NSString *) aString; // 判断字符串是否以另一个字符串结尾
例子:
if([filename hasPrefix: @”draft”])
字符串某处包含其他字符串
-(NSRange) rangeOfString : (NSString *)aString;例:
NSRange range = [fileName rangeOfString : @"chapter"];
找到了range.start和length为数字,没找到start为NSNotFound
可变性的字符串
NSMutableString
NSString是不可变的字符串,NSMutableString是NSString的子类可以改变字符串的长度
使用类方法stringWithCapacity创建或stringWithFormat –因为继承的关系NSString中的类也可调用
+(id)stringWithCapacity:(unsigned) capacity;
例:NSMutableString *string;
string = [NSMutableString stringWithCapacity:42];
附加新字符串appendString或appendFormat
-(void) appendString: (NSString *) aString; //将aString附加到接收对象的末尾 -(void) appendFormat: (NSString *) format, ….; //将格式化的字符串附加在接收字符串的末尾
删除字符串中的字符deleteCharactersInRange
例:
//创建朋友列表 NSMutableString *friends; friends = [NSMutableString stringWithCapacity:50]; [friends appendString: @”James BethLynn Jack Evan”]; //查找Jack的字符范围 NSRange jackRange; jackRange = [friends rangeOfString: @”Jack”]; jackRange.length++; //吃掉剩下的空间 // 删除Jack [friends deleteCharactersInRange: jackRange];
三、集合
NSArray不可变数组
NSArray可以存入任意类型的对象,通过索引访问对象
构造方法+(id)arrayWithObjects:object, …. , nil;
结尾处必须加nil已表示赋值结束
例子:
NSArray *array; array = [NSArray arrayWithObjects : @”one” , @”two” , @”three” , nil];
获取数组对象个数
-(unsigned) count;
获取特定索引处的对象
-(id) objectAtIndex: (unsigned int) index;
例子:二者结合用于循环
int I; for (I = 0; I < [array count]; i++){ NSLog(@”index %d has %” , i , [array objectAtIndex: i]); }
切分数组
-componentsSeparatedByStr
例子:
NSString *string = @”oop:ack:bork:greeble:ponies”; NSArray *chunks = [string componentsSeparatedByString: @”:”];
用componentsJoinedByString
string = [chunks componentsJoinedByString: @”:-)”];
NSMutableArray可变数组
可以任意添加和删除数组中的对象
构造方法:
+(id) arrayWithCapacity : (unsigned) numitems;
例:
NSMutableArray *array; array = [NSMutableArray arrayWithCapacity : 17];
使用addObject在数组末尾添加对象:
-(void) addObject : (id) anObject;
例:
for(i = 0; i < 4 ; i++){ Tire *tire = [Tire new]; [array addObject : tire]; }
使用removeObjectAtIndex删除对象:
-(void) removeObjectAtIndex : (unsigned) index;
例:[array
四、枚举
NSEnumerator使用枚举来迭代运算集合
通过objectEnumerator从前向后遍历集合
通过reverseObjectEnumerator从后向前遍历集合
-(NSEnumerator *) objectEnumerator; -(NSEnumerator *) reverseObjectEnumerator;
利用while循环向枚举器请求nextObject对象(下一个对象):
-(id) nextObject;
当nextObject返回nil时循环结束
举例代码:
NSEnumerator *enumerator; enumerator = [array objectEnumerator]; Id thingle; while(thingle = [enumerator nextObject]){ NSLog(@"I found %@",thingle); }
Tip:对可变数组操作时不能通过添加或删除对象来改变数组容器,否则程序会崩溃
快速枚举
在Mac OS X 10.5 Leopard 中添加了此方法,之前版本无法使用
循环会遍历数组中的每个元素,并用指定的变量存储每个数组对象
例:
for (NSString *string in array){ NSLog(@"I found %@", string); }
NSDictionary不可变字典集合
键值对集合,不可变集合,在创建时就要提交全部的对象和关键字
字典集合对于频繁查询和大型数据集来说要比其他数组高效的多,他直接通过键查询而无需遍历集合
构造函数+(id) dictionaryWithObjectsAnd
此方法接受对象和关键字交替存储的序列,以nil值作为终止符,不能在集合中添加nil值
举例代码:
Tire *t1 = [Tire new]; Tire *t2 = [Tire new]; Tire *t3 = [Tire new]; Tire *t4 = [Tire new]; NSDictionary *tires; tires = [NSDictionary dictionaryWithObjectsAndKeys : t1,@"front-left" , t2,@"front-right" , t3,@"back-left" , t4,@"back-right",nil];
使用方法objectForkey来获取字典中的值,向方法传递对应值的关键字
-(id) objectForKey : (id) akey;
举例代码:
Tire *tire = [tires objectForKey : @"back-right"];
如果没有找到会返回nil值
NSMutableDictionary可变字典集合
构造函数
+(Id) dictionaryWithCapacity : (unsigned int) numitems;
长度只是建议无限制
也可使用dictionary
使用setObject : forKey方法给字典添加元素
-(void) setObject : (id) anObject forKey : (id) aKey;
举例代码:
NSMutableDictionary *tires; tires = [NSMutableDictionary dictionary]; [tires setObject : t1 forKey : @"front-left"];
如果已经有了该对象则修改该对象
使用removeObjectForKey方法删除关键字和对象
-(void)removeObjectForKey : (id) akey;
举例代码:
[tires removeObjectForKey : @"back-left"];
五、各种基本数据类
因为NSArray和NSDictionary只能存储对象,所以Objective-C提供了将基础数据类型封装为对象的类
NSNumber类包装基本数据类型
使用下列类方法创建新的NSNumber对象
+(NSNumber *) numberWithChar : (char) value; +(NSNumber *) numberWithInt : (int) value; +(NSNumber *) numberWithFloat : (float) value; +(NSNumber *) numberWithBool : (BOOL) value;
还有很多其他数据类型的方法,行驶大同小异
调用封装到NSNumber中的数据
-(char) charValue; -(int) intValue; -(float)floatValue; -(BOOL) boolValue; -(NSString *) stringValue;
etc
Tip:高精度数据可以被低精度数据提取方法提取出来,NSNumber会对数据进行适当转换
NSValue可以包含任何值
NSValue是NSNumber的超类
NSValue可以放入NSArray和NSDictionary中
构造函数:
+(NSValue *) valueWithBytes : (const void *) value存储变量的地址
C语言中使用操作符&对象 名来操作对象地址
objCType : (const char *) type;
描述数据类型的字符串
@encode编译器指令产生
数据类型字符串
举例代码:
NSRect rect = NSMakeRect(1,2,30,40); NSValue *value; value = [NSValue valueWithBytes : &rect objCType : @encode(NSRect)]; [array addObject : value];
使用方法getValue来提取数值:需提供数值变量的地址,即&对象名
-(void) getValue : (void *) value;
举例代码:
value = [array objectAtIndex : 0]; [value getValue : &rect];
Tip:还记得吗,get开头的方法返回的是一个指针
Cocoa提供了将常用struct型数据转换为NSValue的方法:
+(NSValue *) valueWithPoint : (NSPoint) point; +(NSValue *) valueWithSize : (NSSize) size; +(NSValue *) valueWithRect : (NSRect)rect; -(NSPoint) pointValue; -(NSSize) sizeValue; -(NSRect) rectValue;
举例代码:在NSArray中存储和检索NSRect
value = [NSValue valueWithRect : rect]; [array addObject : value]; …… NSRect anotherRect = [value rectValue];
NSNull空值对象
因为nil在集合中有特殊含义所以创造出来这个类来代替nil
获得一个NSNull空值方法+(NSNull
举例代码:
(1)判断是否为空
id homefax; homefax = [contact objectForKey : @"123 456 789"]; if(homefax == [NSNull null]){ // }
(2)将空添加到集合中
[contact setObject : [NSNull null] forKey : @"is nil"];
作者:
出处:http://www.cnblogs.com/ChenYilong/(点击RSS订阅)
本文版权归作者和博客园共有,欢迎转载,
但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。