標籤:
Swift集合類型介紹
和OC類似,Swift也提供了三種集合類型:Array、Set以及Dictionary。Arrays用於順序儲存資料;Sets用於無序儲存不同值;Dictionaries用於儲存無序索引值對。
但Swift的collections和OC中的collections在要儲存的元素類型要求是不同。
Swift collections明確了元素類型。在OC中,collections(譬如array、dictionary、set)對儲存的元素的類型只有一個要求:是類執行個體即可;但在Swift中,collections儲存的元素類型必須明確,這意味著我們不能把不正確的資料類型插入到collections中;當然在另外一個方面,這保證了我們完全可以對擷取出的資料類型非常自信。Swift對顯式類型集合的使用確保了我們的代碼對工作所需要的類型非常清楚,也讓我們在開發階段就能發現任何的類型不符錯誤。
Swift collections可以用來儲存實值型別資料。正如上所述,在OC中,collections中的元素必須是類執行個體,不能是int之類的基礎資料型別 (Elementary Data Type)或枚舉,這點對於Swift就不成立了。Swift的collections對元素類型無挑剔,既可以是實值型別,也可以是參考型別。(但同一個collection元素類型必須是一樣的)。
mutable和immutable
在OC中,每種類型的collection分別對應immutable版本和mutable版本,譬如字典類型的NSDictionary和NSMutableDictionary。
在Swift中,collection的mutablility性質由關鍵字var
和let
決定,如果定義collection對象時使用var
修飾,則說明是該collection類型對象是mutable的,意味著你可以對該collection對象施以增刪查處理;反之,若定義collection對象時使用let
修飾,則說明是該collection類型對象是immutable的,意味著該collection的contents和size不能被改變;
P.S:這也可以看出,Swift中的let
和var
比C語言中的const
要強大得多,因此不能把var
和let
的作用簡單類比為const
。
數組
定義數組
數組構造語句有兩種寫法:Array<SomeType>
或者[SomeType]
,如下:
var shoppingList: [String] = ["Eggs", "Milk"]var myGirlFriends: Array<String> = ["Lily", "Lucy"]
建立一個空數組
在OC中,建立一個空數組的方式有多種:[[NSMutableArray alloc] init]
或者[NSMutableArray array]
。
// 聲明並初始化var Ints = [Int]() // 先聲明後初始化var Strings: [String]Strings = [] // 等價於Strings = [String]()
訪問和修改數組
OC中的數組支援的操作在Swift基本也都支援,只是很多方法的名稱不太一樣。
判斷數組是否為空白
在OC中,判斷數組是否為空白的做法是訪問其count屬性,在Swift中,isEmpty
提供了更為便捷的方式。
插入元素
譬如在OC中添加元素使用方法addObject:
,在Swift中對應append
;除了append
方法之外,Swift還提供了+=
操作(+=
算是文法糖吧),它用來添加一個N個元素。如下:
var myGirlFriends = [String]()myGirlFriends.append("張二丫")myGirlFriends.append("李翠花")myGirlFriends += ["王小莉", "陳美美"]
append
和+=
都是在數組的末尾添加元素,如果在指定index插入,則使用insert
方法。
子數組操作
OC中有針對子數組的操作介面,譬如subarrayWithRange:
,在Swift中提供了更簡便的訪問方式 — 使用...
和..<
操作符,譬如myGirlFriends[1..<3]
訪問index=1,2的元素,myGirlFriends[1...3]
訪問index=1,2,3的元素。
字典
在OC中,字典要求key和value都是執行個體,所以一般情況下,key值都是NSString類型(雖然也可以使用其他類型對象作為key值)。在Swift中,因為沒有這方面的要求,key值和value值可以是任意類型資料,但和數組一樣,必須保證一致性,也即某個特定字典中可以儲存的鍵和值必須提前定義清楚。
注意:字典對Key type的唯一要求是:
A dictionary Key
type must be conform to be Hashable
protocol.
確保KeyType可雜湊,這樣才能保證它是獨一無二的,方便hash嘛!所有的Swift基本類型(譬如String/Int/Double)都是預設可雜湊的,這些基本類型都可以作為Key Type。
定義字典
在OC中,數組對應的符號是[]
,字典對應的是符號是{}
;但在Swift中,和數組一樣,字典對應的符號也是[]
。
字典的型別宣告同樣有兩種:Dictionary<KeyType, ValueType>
或[KeyType: ValueType]
。
建立一個空字典
// 聲明並初始化var nameOfIntegers = [Int: String]()// 先聲明,後初始化var httpStatusMessage: Dictionary<Int, String>httpStatusMessage = [:] // 等價於httpStatusMessage = [Int: String]()
字典字面值
Swift中的字典字面值和OC中的字典字面值差不多,key-value都是使用key: value
結構,key-value之間都採用,
分隔。但有兩點不同:一是前者使用的是[]
,後者使用的是{}
;二是後者還是用到了@
;如下:
var families = ["Father": "Sad Jason", "Son": "Zhang Buhuai"]
Access Key-Value
所謂『Access Key-Value』無非是根據key讀取某個value,Swift目前為止只定義了一種方式:通過subscript訪問,如families["Father"]
。
- subscript的key類型必須和該dictionary在定義時指定的key type一致,否則報錯;
- 通過subscript訪問dictionary的value的傳回值是一個optional,optional包含一個有效value值或者nil;
Modify Key-Value
『Modify Key-Value』指的是往Dictionary中添加一個key-value或者更改key-value。Swift迄今為止提供了兩種方式:基於subscript以及update
方法,如下:
var families = ["Father": "Sad Jason", "Son": "Zhang Buhuai"]families.updateValue("Liu", forKey: "Mother") // 等價於families["Mother"] = "Liu"
顯然,families["Mother"] = "Liu"
有兩種結果:
- 字典
families
中不存在key為"Mother"
的key-value,處理結果是families
中多了一對key-value"Mother": "Liu"
;
- 字典
families
中存在key為"Mother"
的key-value,處理結果是families
中key為"Mother"
的索引值對的value值為"Liu"
。
updateValue(forKey:)
和subscript略有不同,它會返回一個包含字典實值型別的optional,其值為該key-value更新之前的value值。
Remove Key-Value
『Remove Key-Value』指的是刪除dictionary中可能存在的某個key-value。和『Modify Key-Value』一樣,Swift為『Remove Key-Value』提供了兩種操作方式:dictionary[key] = nil
或dictionary. removeValueForKey(key)
,如下:
families.removeValueForKey("Father")families["Son"] = nil
不同的是,removeValueForKey
返回一個optional,可能包含被remove的索引值對的value,也可能是nil;
遍曆字典
Swift中遍曆dictionary比OC要優雅太多,其方式比較類似Python,如下:
var families = ["Father": "Sad Jason", "Son": "Zhang Buhuai"]for (member, name) in families { println("\(member): \(name)")}
總結
Swift中針對collection的操作比OC優雅多了,譬如:遍曆字典,使用..<
訪問子數組,提供isEmpty屬性判斷集合是否為空白等等。但個人不是很喜歡...
這個操作符,盡量少用吧。
Swift 集合類型