objective-c Foundation kit 基本数据结构入门
Foundation kit 基本数据结构入门
Cocoa有两个不同的框架组成:Foundation kit和Application kit。Application kit包含了所有的用户接口对象和高级类。Foundation kit中有很多有用的,面向数据的低级类和数据类型,如Nsstring、NsArray、NsEnumerator、NsNumber等。本章主要介绍Foundation kit的一些基本数据结构。
一、常用的结构体
1.NSRange:
typedefstruct_NSRange {
unsigned int location;
unsigned int length;
}
NSRange可以使用3中方式赋值:
<1> 直接赋值
NSRangerange;
range.location= 1;
range.length= 10;
<2> 使用c语言聚合结构赋值机制
NSRangerange = {1, 10};
<3> 使用Cocoa提供的函数:NSMakeRange();
NSRangerange = NSMakeRange(17, 4);
2.NSPoint和NSSize:
typedef struct NSPoint {
floatx;
floaty;
}NSPoint;
typedef struct NSSize {
floatwidth;
floatheight;
}NSSize;
Cocoa提供了一个矩形的结构体:
typedef struct _NSRect {
NSPointorigin;
NSSizesize;
} NSRect;
如同NSRange,Cocoa为我们提供了创建这些结构体的函数:NSMakePoint(),NSMakeSize(),NSMakeRect()。
Cocoa使用结构体定义这些类型,而不是用对象,主要是出于性能上的考虑。
二、字符串
NSString 创建方式可以采用如下方式:
NSString*height;
height = [NSStringstringWithFormat:@"%@",@"fs"];
NSLog(@"height:%@", height);
其中stringWithFormat方法定义如下:
+ (id)stringWithFormat:(NSString *)format, ...
前面的+表示该方法为类方法,并非实例方法。而创建对象的类方法称为工厂方法。
NSString 的长度可以通过length方法得到,如下所示:
long l = [height length];
NSLog(@"%li",l);
NSString的比较类似与java,如果通过==比较,是进行指针的比较,如果相比较值是否相同使用isEqualToString;
但是需要注意,采用stringwithString 方式初始化,与采用直接赋值的方式初始化,指针指向的是相同对象:
NSString *s1 = [NSString stringWithString:@"32k"];
NSString *s2 =[NSString stringWithString:@"32k"];
NSString *s3 =[NSString stringWithFormat:@"%dk", 32];
NSString *s4 =@"32k";
NSString *s5 =[NSString stringWithFormat:@"%@", @"32k"];
if ([s1isEqualToString:s2]) {
NSLog(@"s1 isEqualToString:s2");
}
if (s1 == s2) {
NSLog(@"s1 == s2");
}
if (s3 == s1) {
NSLog(@"s3 == s1");
}
if (s1 == s4) {
NSLog(@"s1 == s4");
}
if (s1 == s5) {
NSLog(@"s1 == s5");
}
其打印结果为:
2011-10-26 23:12:26.955 NSStringTest[561:707] s1isEqualToString:s2
2011-10-26 23:12:26.956 NSStringTest[561:707] s1== s2
2011-10-26 23:12:26.956 NSStringTest[561:707] s1== s4
Programended with exit code: 0
字符串间的比较也可以通过compare函数进行:
if ([@"adb" compare:@"ssd"] ==NSOrderedSame) {
NSLog(@"NSOrderedSame");
}
else if([@"adb" compare:@"ssd"] == NSOrderedAscending) {
NSLog(@"NSOrderedAscending");
}
else if([@"adb" compare:@"ssd"] == NSOrderedDescending) {
NSLog(@"NSOrderedDescending");
}
if([@"Ssd" compare:@"ssd" options:NSCaseInsensitiveSearch] ==NSOrderedSame) {
NSLog(@"NSOrderedSame");
}
else if([@"Ssd" compare:@"ssd" options:NSCaseInsensitiveSearch] ==NSOrderedAscending) {
NSLog(@"NSOrderedAscending");
}
else if([@"Ssd" compare:@"ssd" options:NSCaseInsensitiveSearch] ==NSOrderedDescending) {
NSLog(@"NSOrderedDescending");
}
其中NSOrderedDescending是枚举定义的。 Option为是否添加比较的参数。即是否需要不区分大小写,或者是否是数字比较等。。。
可以通过如下方式判断是否包含子串:
if ([@"sscd"hasPrefix:@"ssc"]) {
NSLog(@"hasPrefix");
}
if ([@"sscd"hasSuffix:@"scd"]) {
NSLog(@"hasSuffix");
}
NSRange range = [@"abcdef"rangeOfString:@"cde"];
NSLog(@"%ul %ul",range.location, range.length);
创建变长字符串:
NSMutableString可以使用stringWithCapacity来创建一个实例。其原理类似与stringBuffer。不多赘述
NSMutableString*mutableString = [NSMutableString stringWithCapacity:30];
[mutableString appendFormat:@"f%@",@"fsd"];
NSLog(@"%@", mutableString);
NSRange r = [@"ffsd" rangeOfString:@"fs"];
[mutableString deleteCharactersInRange:r];
NSLog(@"%@", mutableString);
首先: stringWithCapacity:30 中的30只是一个参考,并不最终决定字符串的长度。其余方法可以参考代码;