您的位置:首页 > 其它

第八章Foundation Kit快速教程

2012-05-25 17:57 531 查看
一、一些有用的数据类型

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) C语言的聚合结构赋值

NSRange range = {17,4};

(3) Cocoa提供的快捷函数NSMakeRange(位置参数、长度参数)

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参数是一个位掩码,可以使用位或|来添加选项标记

NSCaseInsensitiveSearch:不区分大小写字符

NSLiteralSearch:进行完全比较,区分大小写

NSNumericSearch:比较字符串的字符个数,不比较字符值,不选他100会排在99 前面

例:

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可以存入任意类型的对象,通过索引访问对象

不可以存非Objective-C的对象,不能存nil(0或NULL值)

构造方法+(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]);

}

切分数组

-componentsSeparatedByString

例子:

NSString *string =
@”oop:ack:bork:greeble:ponies”;

NSArray *chunks
= [string componentsSeparatedByString: @”:”];

用componentsJoinedByString合并NSArray中的元素创建字符串

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 removeObjectAtIndex
: 1];

四、枚举

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) dictionaryWithObjectsAndKeys : (id) firstObject,(id)firstKey,....;

此方法接受对象和关键字交替存储的序列,以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 *)
null;


举例代码:

(1)判断是否为空

id homefax;

homefax = [contact objectForKey
: @"123 456 789"];

if(homefax == [NSNull null]){

//

}

(2)将空添加到集合中

[contact setObject
: [NSNull null]

forKey
: @"is nil"]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: