一個框架其實就是一個軟體包,它包含了多個類。Mac 操作系統提供了幾十個框架,主要幫助開發者快速的在Mac 系統上開發應用程式。其中包括一些基礎框架,就是為所有程式開發提供基礎的框架,其中幾個常用的類包括:字元串(NSString), 數字(NSNumber), 數組 (NSArray),字典 (N
一個框架其實就是一個軟體包,它包含了多個類。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。 增加的字元個數是結束符'\0'。
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("\n");
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 }