集合
什么是集合?
我們之前介紹了數(shù)據(jù)類(lèi)型,每個(gè)數(shù)據(jù)類(lèi)型中往往包含是單條數(shù)據(jù)。其實(shí),多條數(shù)據(jù)也可以組合的形式出現(xiàn)。這種組合起來(lái)的數(shù)據(jù),就叫做集合。
那么,有哪些組合的形式呢?
數(shù)據(jù)的組合形式
數(shù)據(jù)的組合形式有三種:數(shù)組Array,集合Set,字典Dictionary。
- 數(shù)組:
var array = [1,2,3] - 集合:
var set = [1,2,3] - 字典:
var dictionary = ["numberA":1, "numberB":2, "numberC":3]
這里也有個(gè)集合,不是我們本節(jié)標(biāo)題中說(shuō)的那個(gè)
集合。我們后面用數(shù)據(jù)組合這樣的描述性語(yǔ)言來(lái)避免混淆。
- 術(shù)語(yǔ),英語(yǔ)叫做
jargon,也叫黑話,通常是流行在特定的人群之間的簡(jiǎn)便用語(yǔ)。除了可以提高溝通效率,還能有效隔絕并分辨另外的群體。- 我們?cè)趯W(xué)習(xí)編程的時(shí)候,會(huì)不斷碰到各種術(shù)語(yǔ)。對(duì)老手來(lái)說(shuō),術(shù)語(yǔ)表達(dá)的意思更精確,溝通的效率也更高,但是對(duì)于新手,簡(jiǎn)直是噩夢(mèng)。更糟糕的是,術(shù)語(yǔ)抬高了入門(mén)的門(mén)檻。
- 我爭(zhēng)取把這些術(shù)語(yǔ)都翻譯成白話。
觀察這三種形式,都是用中括號(hào),將多個(gè)數(shù)據(jù)包起來(lái),中間用逗號(hào)連接。其中,字典稍微特殊些,每條數(shù)據(jù)中間是冒號(hào),成對(duì)出現(xiàn)。
既然數(shù)據(jù)能組合,而且有三種形式,它們一定都有自己的特點(diǎn)。比如,如何進(jìn)行創(chuàng)建,訪問(wèn),操作。
創(chuàng)建組合
與創(chuàng)建常量和變量的方法類(lèi)似,我們來(lái)創(chuàng)建一些組合。
創(chuàng)建數(shù)組
var someNumberA = [1,2,3]
如果我們打印someNumberA的數(shù)據(jù)類(lèi)型(print(type(of: someNumbersA))),可以發(fā)現(xiàn),類(lèi)型為Array<Int>,就是說(shuō),這是一個(gè)整型類(lèi)型的數(shù)組。
那么,數(shù)據(jù)能混合嗎?可以試一下:
var mixedValue = [1,2.2,"Hello"],報(bào)錯(cuò)。就是說(shuō)數(shù)組中的數(shù)據(jù)類(lèi)型必須一致。但是,這樣的混合是接受的。var someNumbersB = [1.1,2,3], 這種數(shù)組的類(lèi)型是Array<Double>。其實(shí)Swift已經(jīng)把里面的Int型隱式轉(zhuǎn)換為Double型了。
我們還能用let創(chuàng)建常量數(shù)組,這個(gè)很好理解,常量數(shù)組將不能更改,而變量數(shù)組可以。為了簡(jiǎn)便,我們后面默認(rèn)使用var創(chuàng)建變量數(shù)據(jù)組合。
Swift還提供了Array構(gòu)造數(shù)組的方法:var threeDoubles = Array(repeating: 1, count: 3) // [1,1,1]。
這里,我們順帶可以看到數(shù)組的內(nèi)的數(shù)據(jù)是可以重復(fù)的。創(chuàng)建集合
你剛才可能有點(diǎn)疑惑,集合看起來(lái)跟數(shù)組不是一樣的嗎?其實(shí),集合最大的特點(diǎn)就是集合內(nèi)的數(shù)據(jù)是無(wú)序且非重復(fù)的。另外的兩個(gè)數(shù)組的特性,放到集合身上也是一樣的,集合中的數(shù)據(jù)類(lèi)型必須一致,常量集合不能更改,而變量集合可以。其實(shí),集合還有更多自身的獨(dú)特特性,后面我們會(huì)介紹。
那么,既然形式幾乎一樣,我們?nèi)绻麆?chuàng)建一組集合呢?
var setValues: Set = [1,2,3]
其實(shí)在創(chuàng)建任何一個(gè)數(shù)據(jù)時(shí),我們都可以加上冒號(hào)后面再跟上數(shù)據(jù)類(lèi)型,但是在大部分情況下,Swift是可以推斷出類(lèi)型的,因此,我們建議的原則是,盡量不加,免得代碼看起來(lái)啰嗦。在這里,我們被迫加了: Set這樣一個(gè)聲明,因此,我們print(type(of: setValues))打印的數(shù)據(jù)類(lèi)型就是Set<Int>,一個(gè)Int型的Set。創(chuàng)建字典
字典里的數(shù)據(jù)是成對(duì)出現(xiàn)的,只要數(shù)據(jù)類(lèi)型一致,我們可以這樣做:
var intIntDict = [1:666,2:888,3:999]
var intStringDict = [1:"A",2:"B",3:"C"]
var stringStringDict = ["A":"sky","B":"river","C":"mountain"]
因?yàn)橹欣ㄌ?hào)中帶有帶冒號(hào)的成對(duì)數(shù)據(jù),這種形式不需要顯式聲明,會(huì)自動(dòng)被推斷為字典類(lèi)型。
我們總結(jié)一下如何創(chuàng)建一個(gè)組合的數(shù)據(jù):
創(chuàng)建數(shù)組:var someNumberA = [1,2,3],創(chuàng)建集合:var setValues: Set = [1,2,3],創(chuàng)建字典:var intStringDict = [1:"A",2:"B",3:"C"]。
組合的一些共有特性:
- 組合中的數(shù)據(jù)類(lèi)型要一致;
- 常量組合不能修改,變量組合可以;
訪問(wèn)組合
創(chuàng)建出組合后,我們先看看如何訪問(wèn)它們。
- count計(jì)數(shù)
我們可以計(jì)算組合中包含數(shù)據(jù)的數(shù)量。
var arrayNumbers = [1,2,3,4] // 定義一個(gè)數(shù)組
var setValues: Set = [1,2,3] // 定義一個(gè)集合
var intStringDict = [1:"A",2:"B"] // 定義一個(gè)字典
// 他們都有count方法,用.count調(diào)用
arrayNumbers.count //4
setValues.count //3
intStringDict.count //2
- 遍歷
使用for-in進(jìn)行遍歷,從而訪問(wèn)到組合中的每一個(gè)值,是一個(gè)普遍的操作。
- 遍歷數(shù)組
var arrayNumbers = [1,2,3]
for i in arrayNumbers {
print(i)
}
// 1,2,3
- 遍歷集合
這里就體現(xiàn)了集合與數(shù)組的不同,集合是無(wú)序的,因此在打印遍歷的結(jié)果時(shí),排列的順序是隨機(jī)的,你可以在Playground中試一下。
var setValues: Set = [1,2,3]
for i in setValues {
print(i)
}
// 每次運(yùn)行,結(jié)果順序會(huì)隨機(jī)變化
- 遍歷字典
字典有一對(duì)值,它們被稱(chēng)作keys: values。如果調(diào)用.keys或.values,可以得到一組數(shù)組形式的數(shù)據(jù)。
var intStringDict = [1:"A",2:"B",3:"C"]
print(intStringDict.keys) // 1,3,2 一組無(wú)序的值
你可以單獨(dú)遍歷出key,可以單獨(dú)遍歷出value,也可以同時(shí)遍歷出key: value。
var intStringDict = [1:"A",2:"B",3:"C"]
// 遍歷字典中的keys
for key in intStringDict.keys {
print(key)
}
// 遍歷字典中的values
for value in intStringDict.values {
print(value)
}
// 同時(shí)遍歷key和value
for (key,value) in intStringDict {
print(key, value)
}
字典也是無(wú)序的,多次運(yùn)行,我們可以發(fā)現(xiàn),它的遍歷結(jié)果排列順序也是隨機(jī)的。
- 訪問(wèn)組合
- 數(shù)組
數(shù)組是有序的,有默認(rèn)的下標(biāo)。任何一個(gè)數(shù)組,從第一個(gè)數(shù)據(jù)開(kāi)始數(shù),數(shù)到最后一個(gè)數(shù)據(jù)。數(shù)的時(shí)候,要從零開(kāi)始,每個(gè)數(shù)據(jù)分別對(duì)應(yīng)著0,1,2,3...。因此,我們可以通過(guò)指定下標(biāo)值,訪問(wèn)到想要訪問(wèn)的數(shù)據(jù)。
var arrayNumbers = [1,2,3,4,5]
arrayNumbers[0] // 1
arrayNumbers[2] // 3
// 還可以按范圍讀取
arrayNumbers[0...3] // [1, 2, 3, 4] 注意這里返回的是一個(gè)數(shù)組
- 字典
字典是無(wú)序的,沒(méi)有下標(biāo),但是有key,我們可以通過(guò)key訪問(wèn)value。
var stringStringDict = ["A":"sky","B":"river","C":"mountain"]
stringStringDict["A"] // "sky"
stringStringDict["C"] // "mountain"
- 集合
集合是無(wú)序的,沒(méi)有下標(biāo),也沒(méi)有Key,因此,無(wú)法訪問(wèn)具體的指定數(shù)據(jù)。
但是集合有自己特殊方法,比如排序,包含判斷。
// 排序
setIntValues.sorted() // 返回了一個(gè)從小到大排序的有序數(shù)組
setStringValues.sorted() //同樣返回一個(gè)有序數(shù)組
// 包含判斷 contains
setIntValues.contains(1) // true
setStringValues.contains("D") // false
小結(jié)與預(yù)告
本節(jié)我們介紹了數(shù)據(jù)組合的三種形式:數(shù)組Array,集合Set,字典Dictionary。
如何創(chuàng)建他們,如何訪問(wèn)他們等,講到這里,內(nèi)容已經(jīng)有點(diǎn)多,我們暫且休息一下。
有疑惑的地方,你可以試著在playground上面多敲一些代碼試試。
下節(jié),我們繼續(xù)介紹如何操作這些數(shù)據(jù)組合。