Foundation kit 基本数据 结 构入 门
Cocoa 有两个不同的框架组成:Foundation kit 和Application kit 。Application kit 包含了所有的用户接口对象和高级类。Foundation kit 中有很多有用的,面向数据的低级类和数据类型,如Nsstring 、NsArray 、NsEnumerator 、NsNumber 等。本章主要介绍Foundation kit 的一些基本数据结构。
一、常用的 结 构体
1.NSRange :
typedef struct_NSRange {
unsigned int location;
unsigned int length;
}
NSRange 可以使用3 中方式赋值:
<1> 直接赋值
NSRange range;
range.location = 1;
range.length = 10;
<2> 使用c 语言聚合结构赋值机制
NSRange range = {1, 10};
<3> 使用Cocoa 提供的函数:NSMakeRange();
NSRange range = NSMakeRange(17, 4);
2.NSPoint 和 NSSize:
typedef struct NSPoint {
float x;
float y;
}NSPoint;
typedef struct NSSize {
float width;
float height;
}NSSize;
Cocoa 提供了一个 矩形的结构体:
typedef struct _NSRect {
NSPoint origin;
NSSize size;
} NSRect;
如同NSRange ,Cocoa 为我们提供了创建这些结构体的函数:NSMakePoint(),NSMakeSize(),NSMakeRect() 。
Cocoa 使用结构体定义这些类型,而不是用对象,主要是出于性能上的考虑。
二、字符串
NSString 创 建方式可以采用如下方式 :
NSString *height;
height = [NSString stringWithFormat:@"%@",@"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 ([s1 isEqualToString: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] s1 isEqualToString: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
Program ended 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 只是一个参考,并不最 终 决定字符串的 长 度。其余方法可以参考代 码 ;