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