25、字符串
-(BOOL) isEqualToString: (NSString*) s
比较两个字符串是否相等,与JAVA 一致的地方是==比较指针,比较对象是否相同要用到equal 方法。
-(NSMutableString*) appendString: (NSString*) s
这与JAVA 的StringBuffer 的append 没什么区别。
26、数组
Cocoa 使用NSArray 表示数组,但是它不能存储基本数据类型、enum、struct、nil,只能存储Objective-C 的对象。
NSArray *array=[NSArray arrayWithObjects: @"One", @"Two", @"Three", nil];
从这个类方法arrayWithObjects 的定义可以看出,它使用nil 表示数组元素结束,这也是nil 不能存储在NSArray 中的原因。
NSMutableArray 为长度可变的数组,相当于JAVA 中的List:
NSMutableArray *mArray=[NSMutableArray arrayWithCapacity: 10];
[mArray addObject: @"Apple"];//添加数组元素
NSEnumerator *e = [mArray objectEnumerator];//获取数组的迭代器,相当于JAVA 中的Iterator,reserveObjectEnumerator 用于获取反转之后的数组迭代器。与JAVA 一致的地方是你在使用迭代器时,不能对数组进行添加、删除操作。
for(NSString *ms in mArray){
NSLog(@"%@",ms);
}
//for-each 快速枚举为Objective-C 2.0 的新特性,Windows 上的GNUStep 并不支持。
27、字典(哈希表)
NSDictionary 用于存储key-value 的数据结构,与JAVA 中的Map 类似。
NSDictionary *dic=[NSDictionary dictionaryWithObjectsAndKeys: @"Apple", @"A", @"Google",@"G", nil];//dictionaryWithObjectAndKeys 后的可变参数,每两个为一个value-key,以nil 表示结束。
NSLog(@"%@",[dic objectForKey: @"A"]);//按照指定的key 查询value
同样的有NSMutableDictionary 表示长度可变的字典。
NSMutableDictionary *mDic=[NSMutableDictionary dictionaryWithCapacity: 10];
[mDic setObject: @"Apple" forKey: @"A"];//添加value-key 对
for(id key in mDic){
NSLog(@"%@ : %@",key,[mDic objectForKey: key]);
}
//快速迭代的for-each 循环
28、哈希Set
NSSet 表示以hash 方式计算存储位置的集合,与JAVA 中的HashSet 是一致的。在NSSet 中的每个对象都有一个唯一的hash 值,重复的对象将只能保留一个。因此,这引出了Objective-C中的对象比较问题,这需要你实现从NSObject 继承而来的如下两个方法:
- (BOOL) isEqual: (id) anObject;
- (NSUInteger) hash;
这与JAVA 的对象比较没有什么区别,两个相等的对象必须有相同的hashCode,所以这两个方法必须同时实现。
同样的,NSMutableSet 表示长度可变的哈希Set。
29、封装类(相当于java的包装器)
前面的几个容器类的对象都不能存放基本数据结构、enum、struct、nil,怎么办呢?在JAVA中我们知道所有的基本数据类型都有对应的封装类,例如:int---Integer、boolean---Boolean,使用封装类可以把基本数据类型包装为对象,而封装类本身又有方法可以返回原来的基本数据类型。Cocoa 使用NSValue 作为封装类。
NSRect rect=NSMakeRect(1,2,30,50);//这个是在前面提到过的一个表示矩形的结构体
NSValue *v=[NSValue valueWithBytes: &rect objCType: @encode(NSRect)];
/<IMG title="java 与oc之间的比较" alt="java 与oc之间的比较" SYSFACE="79">alueWithBytes 要求传入包装数据的地址,也就是变量中存储的数据的首地址,我们依然使用C 语言的&作为地址运算符,计算指针存储的首地址。
//objCType 要求传入用于描述数据的类型、大小的字符串,使用@encode 指令包装数据所属的类型。
NSMutableArray *mArray=[NSMutableArray arrayWithCapacity: 3];
[mArray addObject: v];
NSRect rect2;
[[mArray objectAtIndex: 0] getValue: &rect2];
//NSValue 的-(void) getValue: (void*) value 方法可以将NSValue 中的数据内容取出,要求传入的参数是一个指针,也就是说getValue 方法将你传入的指针指向存储的数据。
//一般Cocoa 中的getXXX 方法都是这个作用,这也是为什么前面的getter 方法不要以get作为方法前缀的原因。
对于基本数据类型,你可以使用简便的NSNumber 来封装,它是NSValue 的子类。
如果你想存储空值到集合类,可以使用NSNull,它使用NSNull *n =[NSNull null];的方式创建。
|
|