3 字符串 [Objective-C基础教程]
一些有用的数据类型:
表示范围作用的结构体: NSRange :
有三种方式创建新的 NSRange
1 、 NSRange range ;
range.location = 17;
range.length = 4;
2 、 NSRange range = {17 , 4} ;
3 、 NSRange range = NSMakeRange ( 17 , 4 ); (推荐)
表示用来处理几何图形的数据类型: NSPoint (点坐标)和 NSSize (长度和宽度)还有一个矩形数据 类
型(由点和大小复合而成) NSRect
Cocoa 提供创建这些数据类型方法: NSMakePoint ()、 NSMakeSize ()和 NAMakeRect ()
表示字符串的类 NSString
NSString *heigth = [ NSString stringWithFormat : @"You heigth is %d feet,%d inches", 5,11 ];
创建的类对象包含了指向超类的指针、类名和指向类方法的列表的指针。类对象还包含一个 long 的数 据 ,
为新创建的类对象指定大小。
返回字符串中的字符的个数:
unsigned int length = [heigth length];
返回 Bool 值的字符串比较函数:
- (BOOL) isEqualToString : ( NSString * ) aString;// 比较两个字符串的内容是否相等
还可以使用 compare :方法
- ( NSComparisonResult ) compare :( NSString * ) string;// 逐个字符比较
不区分大小写的比较:
- ( NSComparisonResult ) compare :( NSString * ) string options :( unsigned ) mask ;
注意: NSComparisonResult 是一个枚举值
options 是一个位掩码,即:
NSCaseInsensitiveSearch :不区分大小写
NSLiteralSearch : 进行完全比较,区分大小写
NSNumericSearch : 比较字符串的字符个数,而不是字符值
检查字符串是否以另一个字符串开头
- ( BOOL ) hasPrefix : (NSString *)aString;
判断字符串是否是以另一个字符串结尾
- ( BOOL ) hasSuffix : (NSString *)aString;
如果你想知道字符串内的某处是否包含其他字符串,使用 rangeOfString : 方法
- ( NSRange ) rangeOfString :( NSString * ) aString ;
NSString 是不可变的, NSMutableString 是可变的。用方法 stringWithCapacity :来创建
NSMutableString *string = [NSMutableString stringWithCapacity : 42];
可以使用 appendString :或 appendFormat : 来附加新字符串:
- (void) appendString : ( NSString * ) aString ;
- (void) appendFormat : ( NSString * ) format , . . . ;
可以使用 deleteCharactersInRange : 方法删除字符串中的字符
- (void) deleteCharactersInRange : ( NSRange ) range ;'
集合家族:
NSArray :用来存储对象的有序列表(任意类型的对象)
限制:只能存储 Objective — C 的对象,不能存储 C 语言的基本数据类型( int 、 float 、 enum 、 struct 、或者 NSArray
中的随机指针)。同时也不能存储 nil (对象的零值或 NULL 值)
// 创建一个新的 NSArray
NSArray *array = [ NSArray arrayWithObjects : @"one",@"two", nil ];
// 获得包含的对象个数
- ( unsigned ) count ;
// 获得特定索引处的对象
- ( id ) objectAtIndex :( unsigned int ) index ;
切分数组:
使用 componentsSeparatedByString : 来切分 NSArray ,
NSString *string = @"oop : ack : bork : greeble : ponies" ;
NSArray *chunks = [string componentsSeparatedByString : @":"];
使用 componentsJoinedByString : 来合并 NSArray 中的元素并创建字符串
string = [chunks componentsJoinedByString : @":-)"] ;
NSArray 是不可变数组,数组中包含的对象是可以改变的,但是数组对象本身是不会改变的。
可变数组 NSMutableArray 通过类方法 arrayWithCapacity : 来创建可变数组
+ ( id ) arrayWithCapacity :( unsigned ) numItems ;
NSMutableArray *array = [NSMutableArray arrayWithCapacity : 17];
使用 addObject : 在数组末尾添加对象
- ( void ) addObject :( id ) anObject
删除特定索引的对象
- ( void ) removeObjectAtIndex :( unsigned ) index ;
注:可变数组还可以在特定索引处插入对象,替换对象,为数组排序, NSArray 还提供了大量好用的功能 。
枚举:
NSEnumerator 用来描述这种集合迭代器运算的方法:
要想使用 NSEnumerator ,需要通过 objectEnumerator 向数组请求枚举器:
- (NSEnumerator *) objectEnumerator;
可以像这样使用这个方法:
NSEnumerator *enumerator ;
enumerator = [array objectEnumerator ];
注:若想从后向前枚举集合,使用方法 reverseobjectEnumerator ; 也可以使用。
获得枚举器以后,开始 while 循环,每次循环都向这个枚举器请求它的 nextObject
- ( id ) nextObject ; // 返回 nil 表明循环结束
注:在枚举的过程中不能改变数组容器。
快速枚举示例:
for ( NSString *string in array ) {
NSLog ( @"I found %@", string );
}
数组排序:
例如:一条记录就是一条卡片的信息,包括( NSString *name 和 NSString *email )
- ( void ) sort
{
[book sortUsingSelector:@selector(compareNames:)]
}
其中:
@selector(compareNames:)
// 创建一个 SEL 类型的 selector , sortUsingSelector: 使用该方法比较数组中的两个元素,
sortUsingSelector: 方法需要完成这样的比较,它先调用这个指定的 selector 方法,然后向数组(接受
者)的第一条记录发送消息,比较其参数和此记录。指定方法的返回值为 NSComparisonResult 类型,返
回值为:若小于返回 NSOrderedAscending ;相等返回 NSOrderedSame ;大于返回 NSOrderedDescending
-(NSComparisonResult)compareNames:(id)element
{
return [name compare:[element name]];
}
NSDictionary :(关键字和定义的组合)
NSDictionary 通常在给定一个关键字(通常是一个 NSString 字符串)下存储一个数值(可以是任何 类
型的对象)。然后你可以使用这个关键字查找相应的数值。
使用 dictionaryWithObjectsAndKeys :来创建字典
+ ( id ) dictionaryWithObjectsAndKeys :( id ) firstObject , . . .
例如:
Tire *t1 = [Tire new];
NSDictionary *tires = [ NSDictionary dictionaryWithObjectsAndKeys : t1,@"front-left",nil];
使用方法 objectForKey :来获取字典中的值
- ( id ) objectForKey :( id ) akey ;
查找轮胎可以这样:
Tire *tire = [tires objectForkey : @"front-left"];
创建新的 NSMutableDictionary 对象,向类 NSMutableDictionary 发送 dictionary 消息。也可以使用
dictionaryWithCapacity : 方法来创建新的可变字典
+ ( id ) dictionaryWithCapacity : ( unsigned int ) numItems ;
可以使用方法 setObject : forKey :方法给字典添加元素
setObject : forKey :( id ) aKey
下面是另一种使用发送 dictionary 消息来创建字典的方法:
NSMutableDictionary *tires ;
tires = [NSMutableDictionary dictionary] ;
[tires setObject : t1 forKey : @"front-left"];
. . .
注:若对字典中已有的关键字使用 setObject : forKey :方法,则用新的替换
可以使用 removeObjectForKey : 方法来删除可变字典中的一个关键字
- ( void ) removeObjectForKey : ( id ) aKey ;
注:不要去创建 NSString 、 NSArray 或 NSDictionary 的子类,实在要的话可以用复合的方式来解决问题。
使用这种方法枚举词典:
for ( NSString *key in g )
{
. . .
}
集合对象:
Set 是一组单值对象的集合,有可变和不可变,操作包括:搜索、添加、删除集合中的成员(仅用于可变
集合)、比较两个集合,计算两个集合的交集和并集等。
#import <Foundation/NSSet.h>
常用的 NSSet 方法
方法 说明
+ ( id ) setWithObjects:obj1,obj2,...,nil 使用一列对象创建新集合
- ( id ) initWithObjects:obj1,obj2,...,ni l 使用一列对象初始化新分配的集合
- ( NSUInteger ) count 返回集合的成员个数
- ( BOOL ) containsObject : obj 确定集合是否包含 obj
- ( BOOL ) member : obj 使用 isEqual :方法确定集合是否包含 ob j
- ( NSEnumerator * ) objectEnumerator 为集合中的所有对象返回一个
NSEnumerator 对象
- ( BOOL ) isSubsetOfSet : nsset 确定 receiver 的每个成员是否都出现在
nsset 中
- ( BOOL ) intersectsSet : nsset 确定是否 receiver 中至少一个成员出现
在对象 nsset 中
- ( BOOL ) isEqualToSet : nsset 确定两个集合是否相等
常用的 NSMutableSet 方法( NSSet 的子类)
注: NSInteger 不是一个对象,基本数据类型的 typedef ,被 typedef 成 64 位的 long 或 32 位 int
方法 说明
- ( id ) setWithCapacity:size 创建新集合,使其具有存储 size 个成员的初始空间
- ( id ) initWithCapacity:siz e 将新分配的集合设置为 size 个成员的存储空间
- ( void ) addObject:obj 将对象 obj 添加到集合中
- ( void ) removeObject:obj 从集合中删除对象 obj
- ( void ) removeAllObjects 删除接受者的所有成员
- ( void ) unionSet:nsset 将对象 nsset 的所有成员昂添加到接受者
- ( void ) minusSet:nsset 从接受者中删除 nsset 的左右成员
- ( void ) intersectSet:nsset 将接受者中的所有不属于 nsset 的元素删除
常用的 NSMutableSet 方法( NSSet 的子类)
注: NSInteger 不是一个对象,基本数据类型的 typedef ,被 typedef 成 64 位的 long 或 32 位 int
方法 说明
- ( id ) setWithCapacity:size 创建新集合,使其具有存储 size 个成员的初始空间
- ( id ) initWithCapacity:siz e 将新分配的集合设置为 size 个成员的存储空间
- ( void ) addObject:obj 将对象 obj 添加到集合中
- ( void ) removeObject:obj 从集合中删除对象 obj
- ( void ) removeAllObjects 删除接受者的所有成员
- ( void ) unionSet:nsset 将对象 nsset 的所有成员昂添加到接受者
- ( void ) minusSet:nsset 从接受者中删除 nsset 的左右成员
- ( void ) intersectSet:nsset 将接受者中的所有不属于 nsset 的元素删除
- ( char ) charValue ;
- ( int ) intValue ;
- ( float ) floatValue ;
- ( BOOL ) boolValue ;
- ( NSString * ) stringValue ;
NSValue NSValue NSValue NSValue :
NSNumber 实际上是 NSValue 的子类, NSValue 可以封装任意值。可以用 NSValue 将结构放入 NSArr ay
和 NSDictionary 中。
创建新的 NSValue :
+ ( NSValue * ) valueWithBytes : (const void *) value
objCType : (const char *)type;
@encode 编译器指令可以接受数据类型的名称并为你生成合适的字符串。
NSRect rect = NSMakeRect ( 1 , 2 , 30 , 40 );
NSValue * value ;
value = [NSValue valueWithBytes : &rect objCType : @encode(NSRect)];
使用 getValue :来提取数值 (传递的是要存储这个数值的变量的地址) ( 先找地址再取值 )
value = [array objectAtIndex : 0];
[ value getValue : & rect ] ;
注: Cocoa 提供了将常用的 struct 型数据转化成 NSValue 的便捷方法:
+ ( NSValue * ) valueWithPoint :( NSPoint ) point ;
+ ( NSValue * ) valueWithSize :( NSSize ) size ;
+ ( NSValue * ) valueWithRect :( NSRect ) rect ;
- ( NSSize ) sizeValue ;
- ( NSRect ) rectValue ;
- ( NSPoint ) pointValue ;
NSNull NSNull NSNull NSNull :
在关键字下如果属性是 NSNull 表明没有这个属性,没有数值的话表明不知道是否有这个属性。 [NSN ull
null] // 总返回一样的值
+ ( NSNull * ) null ;
例如:
[contast setObject : [NSNull null] forKey: @"home"];
访问它:
id home = [contast objectForKey : @"home" ] ;
if ( home = = [NSNull null] ) {
. . .
}
NSFileManager 允许对文件系统进行操作(创建目录、删除文件、移动文件或获取文件信息)
// 创建一个属于自己的 NSFileManager 对象
NSFileManager *manager = [NSFileManager defaultManager] ;
// 将代字符 ‘ ~ ’ 替换成主目录
NSString *home = [@"~" stringByExpandingTildeInPath] ;
// 输出文件的扩展名
- ( NSString * ) pathExtension