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只是一个参考,并不最终决定字符串的长度。其余方法可以参考代码;      

相关推荐