本文首發於我的個人博客:『不羈閣』 https://bujige.net
文章鏈接:https://bujige.net/blog/iOS-Foundation-Dictionary.html
本文對Foundation框架中的字典類(NSDictionary和NSMutableDictionary)的使用做一個詳細的總結。
1. NSDictionary
1.NSDictionar介紹
- Dictionary翻譯過來叫做"字典"
- 日常生活中,“字典”的作用:通過一個拼音或者漢字,就能找到對應的詳細解釋
- NSDictionary的作用類似:通過一個鍵(key),就能找到對應的值(value)
- NSDictionary中的鍵(key)是單值,通常是字符串,也可以是其他對象類型
- NSDictionary中和鍵(key)關聯的值(value)可以是任何對象類型,但不能是nil
- NSDictionary是不可變的,一旦初始化完畢,裏面的內容就無法修改
2.NSDictionary的創建
+ (instancetype)dictionary;
+ (instancetype)dictionaryWithObject:(id)object forKey:(id <NSCopying>)key;
+ (instancetype)dictionaryWithObjectsAndKeys:(id)firstObject, ...;
+ (id)dictionaryWithContentsOfFile:(NSString *)path;
+ (id)dictionaryWithContentsOfURL:(NSURL *)url;
3. NSDictionary創建和獲取簡寫
- 以前NSDictionary創建方式
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@"Walkers", @"name", @"12345678", @"phone", @"ZhongGuo", @"address", nil];
NSDictionary *dict = [NSDictionary dictionaryWithObjects:@[@"Walkers",@"30",@"1.75"] forKeys:@[@"name",@"age",@"height"]];
- 現在NSDictionary創建簡寫方式
NSDictionary *dict = @{@"name":@"Walkers", @"phone":@"12345678", @"address":@"ZhongGuo"};
- 以前NSDictionary獲取元素方式
[dict objectForKey:@"name”];
- 現在NSDictionary獲取元素簡寫方式
dict[@"name”];
4. 鍵值對集合的特點
- 字典存儲的時候,必須是"鍵值對"的方式來存儲(同時鍵不要重複)
- 鍵值對中存儲的數據是"無序的"
- 鍵值對集合可以根據鍵,快速獲取數據
5. NSDictionary的遍歷
- 返回字典的鍵值對數目
- (NSUInteger)count;
NSDictionary *dict = @{@"name":@"Walkers", @"phone":@"12345678", @"address":@"ZhongGuo"};
NSLog(@"count = %lu",[dict count]);
輸出結果:count = 3
- 根據key取出value
- (id)objectForKey:(id)aKey;
NSDictionary *dict = @{@"name":@"Walkers", @"phone":@"12345678", @"address":@"ZhongGuo"};
NSLog(@"%@",[dict objectForKey:@"name"]);
輸出結果:Walkers
- 快速遍歷
NSDictionary *dict = @{@"name":@"Walkers", @"phone":@"12345678", @"address":@"ZhongGuo"};
for (NSString *key in dict) {
NSLog(@"key = %@, value = %@", key, dict[key]);
}
輸出結果:
key = name, value = Walkers
key = phone, value = 12345678
key = address, value = ZhongGuo
- Block遍歷
[dict enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSString *obj, BOOL *stop) {
NSLog(@"key = %@, value = %@", key, obj);
}];
6. NSDictionary文件操作
- 將字典寫入文件中
- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;
- (BOOL)writeToURL:(NSURL *)url atomically:(BOOL)atomically;
- 存儲結果是xml文件格式,但蘋果官方推薦爲plist後綴
- 示例
NSDictionary *dict = @{@"name":@"Walkers", @"phone":@"12345678", @"address":@"ZhongGuo"};
BOOL flag = [dict writeToFile:@"/Users/Walkers/Desktop/dict.plist" atomically:YES];
NSLog(@"flag = %i", flag);
輸出結果:flag = 1
文件裏的內容顯示結果如下圖
- 從文件中讀取字典
NSDictionary *newDict = [NSDictionary dictionaryWithContentsOfFile:@"/Users/Walkers/Desktop/dict.plist"];
NSLog(@"newDict = %@", newDict);
7. NSDictionary和NSArray對比
1. NSDictionary和NSArray的區別
- NSArray是有序的,NSDictionary是無序的
- NSArray是通過下標訪問元素,NSDictionary是通過key訪問元素
2. NSDictionary和NSArray的用法
- 創建
// 數組
@[@"Walkers", @"Rose"] (返回是不可變數組)
// 字典
@{ @"name" : @"Walkers", @"phone" : @"12345678" } (返回是不可變字典)
- 訪問
// 數組
id d = array[1];
// 字典
id d = dict[@"name"];
- 賦值
// 數組
array[1] = @"Walkers";
// 字典
dict[@"name"] = @"Walkers";
2. NSMutableDictionary
1.NSMutableDictionary介紹
- NSMutableDictionary是NSDictionary的子類
- NSDictionary是不可變的,一旦初始化完畢後,它裏面的內容就永遠是固定的,不能刪除裏面的元素,也不能再往裏面添加元素
- NSMutableDictionary是可變的,隨時可以往裏面添加\更改\刪除元素
2. NSMutableDictionary的常見操作
- 添加/修改一個鍵值對(如果aKey之前有值,則會把aKey之前對應的值給替換掉)
- (void)setObject:(id)anObject forKey:(id <NSCopying>)aKey;
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:@"Walkers" forKey:@"name"];
NSLog(@"%@", dict);
輸出結果:
{
name = Walkers;
}
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:@"Walkers" forKey:@"name"];
NSLog(@"%@", dict);
[dict setObject:@"abc" forKey:@"name"];
NSLog(@"%@", dict);
輸出結果:
{
name = Walkers;
}
{
name = abc;
}
- 通過aKey刪除對應的value
- (void)removeObjectForKey:(id)aKey;
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setValuesForKeysWithDictionary: @{@"name":@"Walkers", @"phone":@"12345678", @"address":@"ZhongGuo"}];
[dict removeObjectForKey:@"name"];
NSLog(@"%@",dict);
輸出結果:
{
address = ZhongGuo;
phone = 12345678;
}
- 刪除所有的鍵值對
- (void)removeAllObjects;
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setValuesForKeysWithDictionary: @{@"name":@"Walkers", @"phone":@"12345678", @"address":@"ZhongGuo"}];
[dict removeAllObjects];
NSLog(@"%@",dict);
輸出結果:
{
}
3. NSMutableDictionary的簡寫
- 以前設置鍵值對方式
[dict setObject:@"Jack" forKey:@"name”];
- 現在設置鍵值對方式
dict[@"name"] = @"Jack";