一个框架其实就是一个软件包,它包含了多个类。Mac 操作系统提供了几十个框架,主要帮助开发者快速的在Mac 系统上开发应用程序。其中包括一些基础框架,就是为所有程序开发提供基础的框架,其中几个常用的类包括:字符串(NSString), 数字(NSNumber), 数组 (NSArray),字典 (NSDictionary), 集合 (NSSet)等。这几个类都是经常用到的,所以必须很好的掌握,下来我们就来详细介绍这几个类。
1. 数字对象 (NSNumber)
为什么要使用数字对象?我们已经熟悉了使用 int 等数据类型生明数字变量,但是因为很多类(比如 NSArray)都要求使用对象,但 int 等声明的数字变量不是对象,所以,无法在这些类中使用。 NSNumber 就是数字对象类。
下面通过一个例子来演示这个数字对象的用法。
1 #import <Foundation/Foundation.h> 2 3 int main(int argc,const char *argv[]){ 4 @autoreleasepool { 5 NSNumber *myNumber,*floatNumber,*intNumber,*doubleNumber; 6 7 // 创建 interger 类型对象 8 intNumber = [NSNumber numberWithInt:1]; 9 NSLog(@"intNumber = %li",[intNumber integerValue]); 10 11 // 创建 long 类型对象 12 myNumber = [NSNumber numberWithLong:0xababab]; 13 NSLog(@"myNumber = %lx",[myNumber longValue]); 14 15 // 创建 char 类型对象 16 myNumber = [NSNumber numberWithChar:'c']; 17 NSLog(@"myNumber = %c",[myNumber charValue]); 18 19 // 创建 float 类型对象 20 floatNumber = [NSNumber numberWithFloat:3.14]; 21 NSLog(@"floatNumber = %f",[floatNumber floatValue]); 22 23 // 创建 double 类型对象 24 doubleNumber = [NSNumber numberWithDouble:3.11]; 25 NSLog(@"doubleNumber = %lg",[doubleNumber doubleValue]); 26 27 // 判断两个对象的值是否相等 28 if ([intNumber isEqualToNumber:floatNumber]) 29 NSLog(@"intNumber = floatNumber"); 30 else 31 NSLog(@"intNumber != floatNumber"); 32 33 // 比较两个对象的值大小 34 if ([intNumber compare:floatNumber] == NSOrderedAscending) 35 NSLog(@"左边的数字小"); 36 else 37 NSLog(@"右边的数字小"); 38 } 39 return 0; 40 }
2. 字符串对象
字符串常量是由一个@的符号和一对双引号括起来的字符序列。例如:@"hello world"。字符常量和字符串常量是不同的量,它们的区别主要有以下3种:
1. 字符是由单引号括起来的,而字符串常量是由@和双引号括起来的。
2. 字符常量只有一个字符,而字符串常量可以有多个字符。
3. 字符常量只占一个字节。而字符串常量的字节数是由字符个数加1。 增加的字符个数是结束符' '。
Objective-C 中使用NSString来操作字符串,而不是使用c/c++的char*。它在字符串的前面加一个@符号。比如:@"苹果"。下面通过一个例子来具体表现它在oc中的用法:
2.1 不可修改的字符串 (NSString)
1 #import <Foundation/Foundation.h> 2 3 int main(int argc,const char *argv[]){ 4 @autoreleasepool { 5 6 // stringWithString 是基于一个字符串创建另外一个字符串对象。 7 NSString *str1 = @"hello world"; 8 NSString *str2 = [NSString stringWithString:str1]; 9 NSLog(@"str1 = %@ , str2 = %@",str1,str2); 10 11 // NSString 中提供了格式化字符串的方法 stringWithFormat,oc 中用%@来表示一个字符串的值。 12 NSString *name = @"xiaozhang"; 13 NSString *str3 = [NSString stringWithFormat:@"I am %@",name]; 14 NSLog(@"str3 = %@",str3); 15 16 // 在一个字符串的后面新加一个字符串。 17 NSString *guilin = @"guilin"; 18 NSString *welcome = [guilin stringByAppendingString:@" welcome you!"]; 19 NSLog(@"%@",welcome); 20 21 // 字符串的比较和判断 22 BOOL isSame = [str1 isEqualToString:@"str3"]; 23 if(isSame) 24 NSLog(@"str1 = str2"); 25 else 26 NSLog(@"str1 != str2"); 27 28 NSComparisonResult result = [str1 compare:str2]; 29 if(result == NSOrderedSame) //内容相同 30 NSLog(@"str1 == str2"); 31 else if(result == NSOrderedAscending) // 左边 小于 右边 32 NSLog(@"str1 < str2"); 33 else //result == NSOrderedDescending // 左边 大于 右边 34 NSLog(@"str1 > str2"); 35 36 // 字符串大小写的转换 37 NSString *str4 = [str1 uppercaseString]; // 转换为大写 38 NSString *str5 = [str1 lowercaseString]; // 转换为小写 39 NSLog(@"str4 = %@,str5 = %@",str4,str5); 40 41 // 字符串的截取 42 NSString *str6 = [str1 substringToIndex:2]; 43 NSLog(@"str6 = %@",str6); 44 45 // 去除前4个字符串形成新的字符串 46 NSString *str7 = [str1 substringFromIndex:4]; 47 NSLog(@"str7 = %@",str7); 48 49 // 从某个字符串到某个字符串形成的新的字符 50 NSString *str8 = [[str1 substringFromIndex:2] substringToIndex:5]; 51 NSLog(@"str8 = %@",str8); 52 53 NSRange rang = [str1 rangeOfString:@"lo"]; 54 NSLog(@"包含字符串开始的位置是%lu,长度是%lu",rang.location,rang.length); 55 56 if([str1 rangeOfString:@"lo"].location == NSNotFound) 57 NSLog(@"没有找到包含的字符串"); 58 else 59 NSLog(@"包含字符串开始的位置是%lu,长度是%lu",rang.location,rang.length"); 60 61 } 62 return 0; 63 }
2.2 可修改的字符串 (NSMutableString)
NSString 本身不允许修改,如果要修改的话,可以使用 NSMutableString,NSMutableString 是 NSString 的子类。所有 NSString 都适用于 NSMutableString ,它提供了附加字符串的方法:
- (void) appendString: (NSString *) string;
- (void) appendFormat: (NSSting *)string;
例如:
NSMutableString *str =[NSMutableString stringWithString:@"Giulin"];
[str appendString:@"welcome you!"];
3. 数组对象
数组是有序的对象集合,一般情况下,数组中的元素都是相同类型的。类似可变字符串和不可变字符串,也有可变数组和不可变数组。
3.1 不可变数组 (NSArray)
NSArray 是数组类,在数组的中的元素必须以 nil 结尾。以下举个例子来说明它的具体用法:
#import <Foundation/Foundation.h>
int main(int argc,const char *argv[]){
@autoreleasepool {
NSArray *array = [NSArray arrayWithObjects:@"zhangsan",@"lisi",@"wangwu",@"zhaoliu",nil];
for(int i ; i < [array count] ; i++)
NSLog(@"%@",[array objectAtIndex:i]);
if([array indexOfObject:@"xiaoli"] == NSNotFound)
NSLog(@"xiaoli 不在其中!");
}
return 0;
}
3.2 可修改数组 (NSMutableArray)
NSArray 是静态数组,所以不能往该数组中添加元素,必须使用 NSMutableArray 来动态管理数组。NSMutableArray 是NSArray 的字类。
下面通过具体例子来说明它的具体用法:
1 #import <Foundation/Foundation.h> 2 3 int main(int argc , const char *argv[]){ 4 @autoreleasepool { 5 NSMutableArray *city = [NSMutableArray arrayWithObjects:@"西安",@"北京",@"上海", nil]; 6 [city addObject:@"深圳"]; // 数组中增加一个元素深圳。 7 [city removeObject:@"上海"]; // 数组中删除一个元素上海。 8 [city insertObject:@"桂林" atIndex:1]; // 在第一个元素那里插入桂林。 9 // [city removeAllObjects]; // 删除所有元素。 10 for(int i ; i < [city count] ; i++) 11 NSLog(@"%@",[city objectAtIndex:i]); 12 13 } 14 return 0; 15 16 }
4. 字典对象 (NSDictionary 和 NSMutableDictionary)
NSDictionary 提供了 “键-值” 对的集合。比如,使用字典类实现学生学号到姓名的存放,编号是一个键(唯一性),姓名是一个值。它的方法有:
下面举个例子来看其具体的应用:
1 #import <Foundation/Foundation.h> 2 3 int main(int argc , const char *argv[]){ 4 @autoreleasepool { 5 NSDictionary *student = [NSDictionary dictionaryWithObjectsAndKeys:@"xiaohong",@"01",@"xiaoming",@"02",@"xiaoqiang",@"03",nil]; 6 NSLog(@"%@",[student objectForKey:@"01"]); // 查找 01 键对应的值,不存在返回 nil。 7 NSLog(@"人数:%li",[student count]); // 获得个数。 8 } 9 return 0; 10 }
同上面介绍的字符串和数组类似,NSDictionary 也是不可修改的字典。可变字典是 NSMutableDictionary,它可以动态的添加和删除元素,它的方法有:
下面通过一个具体的例子来简单应用一下:
1 #import <Foundation/Foundation.h> 2 3 int main(int argc , const char *argv[]){ 4 @autoreleasepool { 5 NSMutableDictionary *student = [NSMutableDictionary dictionary]; 6 [student setObject:@"xiaohong" forKey:@"01"]; 7 [student setObject:@"xiaoming" forKey:@"02"]; 8 [student setObject:@"xiaodong" forKey:@"03"]; 9 10 NSLog(@"01: %@",[student objectForKey:@"01"]); 11 NSLog(@"02: %@",[student objectForKey:@"02"]); 12 NSLog(@"03: %@",[student objectForKey:@"03"]); 13 14 } 15 return 0; 16 }
4. 集合对象 (NSSet)
集合对象是一组单值对象的组合,比如 1 个 包含 1 到 50 个数字的集合。集合对象的操作包括搜索,添加,删除集合中的成员,比较 2 个集合,计算两个集合的交集和并集等。在下面的程序中,演示了一些集合的常用方法。
1 #import <Foundation/Foundation.h> 2 3 @interface NSSet (printInteger) 4 5 - (void)printSet; 6 7 @end 8 9 @implementation NSSet (printInteger) 10 11 - (void)printSet{ 12 for (NSNumber *integer in self){ 13 printf("%li",[integer integerValue]); 14 } 15 printf(" "); 16 } 17 @end 18 19 int main(int argc , const char * argv[]){ 20 @autoreleasepool { 21 NSMutableSet *set1 = [NSMutableSet setWithObjects:[NSNumber numberWithInteger:1],[NSNumber numberWithInteger:5],[NSNumber numberWithInteger:3],nil]; 22 23 NSMutableSet *set2 = [NSMutableSet setWithObjects:[NSNumber numberWithInteger:7],[NSNumber numberWithInteger:2],[NSNumber numberWithInteger:4],nil]; 24 25 if([set1 isEqual:set2] == YES) // 比较两个集合是否相等 26 NSLog(@"set1 = set2"); 27 else 28 NSLog(@"set1 != set2"); 29 30 if([set1 containsObject:[NSNumber numberWithInteger:2]] == YES) // 判断该集合是否包含某一元素 31 NSLog(@"set1 包含2"); 32 else 33 NSLog(@"set1 不包含2"); 34 35 [set1 addObject:[NSNumber numberWithInteger:6]]; // 向集合中添加元素 36 [set1 removeObject:[NSNumber numberWithInteger:6]]; // 删除某个元素 37 38 [set1 intersectSet:set2]; // 计算2个集合的交集 39 [set1 unionSet:set2]; // 计算2个集合的并集 40 [set1 printSet]; 41 } 42 return 0; 43 }
5. 枚举访问
对于数组,字典和集合,Objective-C 提供了枚举方法来访问各个元素,具体方法有两种。
方法 1:
方法2:
第二种方法简洁,所以经常用第二种方法,一般称第二种方法为快速枚举。下面举一个字典快速枚举的例子:代码定义了一个NSString 类型的对象,用来保存每次取出来的健值,然后基于取出的键,调用字典对象student的objectForKey:方法将 值 也取出来,并打印到控制台上。
1 #import <Foundation/Foundation.h> 2 3 int main(int argc , const char *argv[]){ 4 @autoreleasepool { 5 NSMutableDictionary *student = [NSMutableDictionary dictionary]; 6 [student setObject:@"xiaohong" forKey:@"01"]; 7 [student setObject:@"xiaoming" forKey:@"02"]; 8 [student setObject:@"xiaodong" forKey:@"03"]; 9 10 for(NSString *key in student) 11 NSLog(@"%@:%@",key,[student objectForKey:key]); 12 } 13 return 0; 14 }