Swift 集合类型
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之类的基本数据类型或枚举,这点对于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 beHashable
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属性判断集合是否为空等等。但个人不是很喜欢...
这个操作符,尽量少用吧。