版本記錄
版本號 | 時間 |
---|---|
V1.0 | 2017.07.25 |
前言
我是swift2.0的時候開始接觸的,記得那時候還不是很穩定,公司的項目也都是用oc做的,并不對swift很重視,我自己學了一段時間,到現在swift3.0+已經出來了,自己平時也不寫,忘記的也差不多了,正好項目這段時間已經上線了,不是很忙,我就可以每天總結一點了,希望對自己對大家有所幫助。在總結的時候我會對比oc進行說明,有代碼的我會給出相關比對代碼。
1. swift簡單總結(一)—— 數據簡單值和類型轉換
2. swift簡單總結(二)—— 簡單值和控制流
3. swift簡單總結(三)—— 循環控制和函數
4. swift簡單總結(四)—— 函數和類
5. swift簡單總結(五)—— 枚舉和結構體
6. swift簡單總結(六)—— 協議擴展與泛型
7. swift簡單總結(七)—— 數據類型
8. swift簡單總結(八)—— 別名、布爾值與元組
9. swift簡單總結(九)—— 可選值和斷言
10. swift簡單總結(十)—— 運算符
11. swift簡單總結(十一)—— 字符串和字符
12. swift簡單總結(十二)—— 集合類型之數組
字典
字典是一種可以存儲多個相同類型值的容器,每個值value
都關聯唯一的鍵key
,存儲在字典中的數據沒有具體順序,可以像查字典一樣根據具體的key
找到唯一對應的value
。
不同的是:
-
swift
的字典使用時需要具體規定可以存儲的鍵和值類型,oc
中的NSMutableDictionary
和NSDictionary
類可以使用任何類型的對象作為鍵和值,并且不會提供任何關于這些對象的本質信息。 -
swift
中在某個特定字典中可以存儲的鍵和值必須提前定義清楚,方法就是通過顯性類型或者類型推斷。
swift
的字典使用Dictionary<keyType, valueType>
定義,其中keyType
就是鍵,valueType
就是鍵對應的值,這里keyType
的唯一限制就是可哈希的,這樣可以保證它是獨一無二的,所有的swift
基本類型(String
、Int
、Double
、Bool
)都是默認可哈希的,未關聯的枚舉成員也是默認可哈希的,所以他們都可以作為鍵使用。
1. 字典字面量
可以使用字典字面量構造字典,字典中的鍵值之間用冒號:
分隔,相鄰的鍵值對之間用逗號,
隔開,下面看swift
中的例子。
var cityDict : [String : String] = ["HaErbin" : "HeiLongJiang", "JiNan" : "ShanDong"]
print(cityDict)
下面看輸出結果
["JiNan": "ShanDong", "HaErbin": "HeiLongJiang"]
像上面這么定義,就表示這個字典的鍵和值的類型都是String
。
如果我們使用字面量構造字典就不用把類型定義清楚,cityDict
也可以像下面這么定義。
var cityDict = ["HaErbin" : "HeiLongJiang", "JiNan" : "ShanDong"]
下面我們看一下oc
中的字典字面量的定義方法。
NSDictionary *cityDict = @{@"HaErbin" : @"HeiLongJiang", @"JiNan" : @"ShanDong"};
NSLog(@"%@",cityDict);
下面看輸出結果
2017-07-25 13:29:33.193621+0800 JJOC[5255:1660727] {
HaErbin = HeiLongJiang;
JiNan = ShanDong;
}
2. 讀取和修改字典
我們可以和數組一樣,通過方法屬性或者下標語法讀取和修改字典的值。
獲取某個字典的數據量
我們先看一下swift
中
var cityDict : [String : String] = ["HaErbin" : "HeiLongJiang", "JiNan" : "ShanDong", "HaiKou" : "HaiNan"]
print("\(cityDict.count)")
下面看輸出結果
3
下面我們在看一下oc
中字典字面量的定義。
NSDictionary *cityDict = @{@"HaErbin" : @"HeiLongJiang", @"JiNan" : @"ShanDong", @"HaiKou" : @"HaiNan"};
NSLog(@"%d",cityDict.count);
下面看輸出結果
2017-07-25 13:50:50.071943+0800 JJOC[5261:1662977] 3
獲取字典是否為空
下面我們看一下swift
中字典是否為空的判斷
var cityDict : [String : String] = ["HaErbin" : "HeiLongJiang", "JiNan" : "ShanDong", "HaiKou" : "HaiNan"]
if cityDict.isEmpty {
print("YES")
}
else {
print("NO")
}
下面我們就看輸出結果
NO
可見,和數組一樣,字典也有這個isEmpty
屬性。
下面我們就看一下oc
中的情況
NSDictionary *cityDict = @{@"HaErbin" : @"HeiLongJiang", @"JiNan" : @"ShanDong", @"HaiKou" : @"HaiNan"};
if (cityDict.count == 0) {
NSLog(@"YES");
}
else {
NSLog(@"NO");
}
下面看輸出結果
2017-07-25 13:56:35.741471+0800 JJOC[5265:1663910] NO
增加字典中的值
我們可以增加字典中對應的值,我們先看一下swift
中的情況。
var cityDict : [String : String] = ["HaErbin" : "HeiLongJiang", "JiNan" : "ShanDong", "HaiKou" : "HaiNan"]
cityDict["NanJing"] = "JiangSu"
print(cityDict)
下面看輸出結果
["HaiKou": "HaiNan", "HaErbin": "HeiLongJiang", "NanJing": "JiangSu", "JiNan": "ShanDong"]
接著看oc
中的情況
NSMutableDictionary *dictM = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"HeiLongJiang", @"HaErbin" ,@"ShanDong", @"JiNan" ,@"HaiNan", @"HaiKou" , nil];
[dictM setObject: @"LiaoNing" forKey:@"ShenYang"];
NSLog(@"%@",dictM);
下面看輸出結果
2017-07-25 14:30:28.030160+0800 JJOC[5279:1668883] {
HaErbin = HeiLongJiang;
HaiKou = HaiNan;
JiNan = ShanDong;
ShenYang = LiaoNing;
}
更改字典中的值
下面我們看一下如何更改字典中的值。
var cityDict : [String : String] = ["HaErbin" : "HeiLongJiang", "JiNan" : "ShanDong", "HaiKou" : "HaiNan"]
cityDict["HaErbin"] = "HeiLongJiang1"
print(cityDict)
下面看輸出結果
["JiNan": "ShanDong", "HaiKou": "HaiNan", "HaErbin": "HeiLongJiang1"]
還可以用updateValue
方法設置或者更新特定鍵對應的值,該方法在這個鍵不存在對應值的時候設置值或者在存在時更新已存在的值,這個方法會有返回值,返回的是更新后的原值。像這個例子中,如果存在該鍵對應的值,就會返回被替換的值,如果不存在那么返回nil
。
var cityDict : [String : String] = ["HaErbin" : "HeiLongJiang", "JiNan" : "ShanDong", "HaiKou" : "HaiNan"]
if let oldValue = cityDict.updateValue("HeiLongJiang1", forKey: "HaErbin") {
print("The old value is \(oldValue)")
}
print(cityDict)
看輸出結果
The old value is HeiLongJiang
["JiNan": "ShanDong", "HaiKou": "HaiNan", "HaErbin": "HeiLongJiang1"]
下面我們看oc
中的情況
NSMutableDictionary *dictM = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"HeiLongJiang", @"HaErbin" ,@"ShanDong", @"JiNan" ,@"HaiNan", @"HaiKou" , nil];
[dictM setObject:@"HeiLongJiang1" forKey:@"HaErbin"];
NSLog(@"%@",dictM);
下面看輸出結果
2017-07-25 14:35:43.640693+0800 JJOC[5283:1669849] {
HaErbin = HeiLongJiang1;
HaiKou = HaiNan;
JiNan = ShanDong;
}
字典值的檢索
下面我們先看一下swift
中字典的檢索。可以用下標語法來檢索某一個鍵對應的值,由于可能存在沒有值的鍵,因此可選類型返回這個鍵存在的值,否則返回nil
。
var cityDict : [String : String] = ["HaErbin" : "HeiLongJiang", "JiNan" : "ShanDong", "HaiKou" : "HaiNan"]
if let province = cityDict["HaErbin"] {
print("The Province is \(province)")
}
else {
print("The Province does not exists")
}
下面看輸出結果
The Province is HeiLongJiang
下面我們就看一下oc
中字典的檢索。
NSMutableDictionary *dictM = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"HeiLongJiang", @"HaErbin" ,@"ShanDong", @"JiNan" ,@"HaiNan", @"HaiKou" , nil];
if ([dictM objectForKey:@"HaErbin"]) {
NSLog(@"The Province is %@", [dictM objectForKey:@"HaErbin"]);
}
else {
NSLog(@"The Province does not exists");
}
下面看輸出結果
2017-07-25 14:53:33.954069+0800 JJOC[5290:1672055] The Province is HeiLongJiang
字典移除鍵值對
下面我們先看一下swift
中如何移除某個鍵值對,一種方法就是通過將某個鍵對應的值賦值為nil
來從字典里刪除這個鍵值對。
var cityDict : [String : String] = ["HaErbin" : "HeiLongJiang1", "JiNan" : "ShanDong", "HaiKou" : "HaiNan"]
cityDict["HaErbin"] = nil
print(cityDict)
下面我們看輸出結果
["JiNan": "ShanDong", "HaiKou": "HaiNan"]
還有就是通過removeValue
方法移除某一個鍵值對,該方法在鍵值對存在的情況下會刪除該鍵值對并返回被移除的值,在鍵值不存在的情況下返回nil
,看下面的例子。
var cityDict : [String : String] = ["HaErbin" : "HeiLongJiang1", "JiNan" : "ShanDong", "HaiKou" : "HaiNan"]
if let removeValue = cityDict .removeValue(forKey: "HaErbin"){
print(removeValue)
}
else {
print("does not exists a value For this key")
}
print(cityDict)
下面看輸出結果
HeiLongJiang1
["JiNan": "ShanDong", "HaiKou": "HaiNan"]
下面我們看一下oc
中的鍵值對的移除。
NSMutableDictionary *dictM = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"HeiLongJiang", @"HaErbin" ,@"ShanDong", @"JiNan" ,@"HaiNan", @"HaiKou" , nil];
[dictM removeObjectForKey:@"HaErbin"];
NSLog(@"%@",dictM);
下面看輸出結果
2017-07-25 15:10:33.523594+0800 JJOC[5299:1674259] {
HaiKou = HaiNan;
JiNan = ShanDong;
}
oc
和swift
中都可以調用removeAllObjects
移除所有的鍵值對。
3. 字典的遍歷
先看一下swift
中字典的遍歷,一種方法就是利用for - in
完成遍歷。每一個字典的數據都是通過 (key, value)
元組的形式返回。并且可以使用臨時常量或者變量來分解這些元組。
var cityDict : [String : String] = ["HaErbin" : "HeiLongJiang", "JiNan" : "ShanDong", "HaiKou" : "HaiNan"]
for (city, province) in cityDict {
print("\(city) in \(province)")
}
下面看輸出結果
JiNan in ShanDong
HaiKou in HaiNan
HaErbin in HeiLongJiang
也可以通過keys
或者values
屬性檢索一個字典的鍵或者值。
var cityDict : [String : String] = ["HaErbin" : "HeiLongJiang", "JiNan" : "ShanDong", "HaiKou" : "HaiNan"]
for city in cityDict.keys {
print(city)
}
print("--------")
for province in cityDict.values {
print(province)
}
看輸出結果
JiNan
HaiKou
HaErbin
--------
ShanDong
HaiNan
HeiLongJiang
還可以用下面的方式Array
的方法獲取數組。
var cityDict : [String : String] = ["HaErbin" : "HeiLongJiang", "JiNan" : "ShanDong", "HaiKou" : "HaiNan"]
let cityKeys = Array(cityDict.keys)
let cityValues = Array(cityDict.values)
print(cityKeys)
print(cityValues)
看輸出結果
["JiNan", "HaiKou", "HaErbin"]
["ShanDong", "HaiNan", "HeiLongJiang"]
接著看一下oc
中利用for - in
的遍歷
NSMutableDictionary *dictM = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"HeiLongJiang", @"HaErbin" ,@"ShanDong", @"JiNan" ,@"HaiNan", @"HaiKou" , nil];
for (NSString *key in dictM.allKeys) {
NSLog(@"%@",key);
}
NSLog(@"--------");
for (NSString *value in dictM.allValues) {
NSLog(@"%@",value);
}
下面看輸出結果
2017-07-25 15:23:30.646094+0800 JJOC[5308:1676982] HaErbin
2017-07-25 15:23:30.646142+0800 JJOC[5308:1676982] JiNan
2017-07-25 15:23:30.646157+0800 JJOC[5308:1676982] HaiKou
2017-07-25 15:23:30.646170+0800 JJOC[5308:1676982] --------
2017-07-25 15:23:30.646187+0800 JJOC[5308:1676982] HeiLongJiang
2017-07-25 15:23:30.646201+0800 JJOC[5308:1676982] ShanDong
2017-07-25 15:23:30.646213+0800 JJOC[5308:1676982] HaiNan
除了for - in
遍歷還可以enumerated
進行遍歷,先看swift
。
var cityDict : [String : String] = ["HaErbin" : "HeiLongJiang", "JiNan" : "ShanDong", "HaiKou" : "HaiNan"]
for (key, value) in cityDict.enumerated(){
print("\(key) in \(value)")
}
下面看輸出結果
0 in ("JiNan", "ShanDong")
1 in ("HaiKou", "HaiNan")
2 in ("HaErbin", "HeiLongJiang")
下面我們就看一下oc
中字典的遍歷。
NSMutableDictionary *dictM = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"HeiLongJiang", @"HaErbin" ,@"ShanDong", @"JiNan" ,@"HaiNan", @"HaiKou" , nil];
[dictM enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
NSLog(@"%@--%@",key,obj);
}];
下面看輸出結果
2017-07-25 15:33:30.457579+0800 JJOC[5316:1678783] HaErbin--HeiLongJiang
2017-07-25 15:33:30.457626+0800 JJOC[5316:1678783] JiNan--ShanDong
2017-07-25 15:33:30.457642+0800 JJOC[5316:1678783] HaiKou--HaiNan
注意:字典屬于無序集合類型,其中鍵值對出現的順序是不一定的。
4. 空字典的創建
我們可以像數組一樣構造一個空字典,先看一下swift
中的情況。
//這就是一個空字典
var nameDict = Dictionary<Int, String>()
上面創建的就是一個鍵類型為Int
,值類型為String
的字典。
如果上下文提供了信息類型,我們就可以使用空字典字面量來創建一個空字典,記作[:]
。
var nameDict = Dictionary<Int, String>()
nameDict[1] = "Lily"
//現在nameDict又成為了一個鍵為Int值為String的空字典了
nameDict = [:]
下面我們就看一下oc
中空字典的實例化
NSMutableDictionary *dictM = [NSMutableDictionary dictionary];
注意:
- 不管是數組還是字典,空對象實例化都是實例可變對象,如果實例化一個不可變對象,后期又不能往里面加數據,那么空對象毫無意義。
- 如果字典或者數組后期是不變化的,就盡量實例化成不可變對象,這樣編譯器會進行優化,同時也防止里面的元素被在不知道的情況下更改。
后記
未完,待續~~~