您的位置:首页 > 移动开发 > Swift

数组和字典—Swift学习笔记(七)

2014-06-20 22:26 225 查看
注:本文为自己学习The Swift Programming Language的笔记,其中的例子为引用原书和其他博文或自己原创的。每个例子都会批注一些实践过程中的经验或思考总结。
1.基础
Swift支持两种集合数据类型:数组[Array]和字典[Dictionary]。
数组是存放着同一数据类型数据的有序集合;字典是存放着能够用特殊的键查找的同一数据类型的数据的无序集合。
数组和字典的同一数据类型的原则是严格遵守的,显式的定义集合数据的类型能帮助梳理程序排查问题。
不同于Objective-C的NSArray和NSDictionary,在Swift中数组和字典总是可变长的。
2.数组

Swift的数组不同于Objective-C的NSArray和NSMutableArray,它不能存储不同类型的数据。它遵循Swift的类型安全原则,能够存储的类型要么用类型注释指出,要么通过推断得出类型。一个数组只能存放同一数据类型的数据,可以是基本数据类型,可以是类、结构体等。
数组声明可以用完整形式Array<SomeType>,也可以用SomeType[ ]简化形式声明。
2.1数组常量

方括号中用逗号隔开同一数据类型的值来声明一个数组常量,数据常量常用来定义一个数组:
var shoppingList: String[] = ["Eggs","Milk","Beef"]
由于有类型推断,类型注释可以省略。

2.2访问和修改数组

Swft数组有只读属性count,存储数组当前元素个数。
布尔类型属性isEmpty反应count是否等于零,即是否数组为空。
Array支持两种方式在数组末尾添加元素,一是数组的append方法,二是+=运算符:

shoppingList.append("Flour")
shoppingList += "Baking Powder"
+=符号也可以连接两个字符串,+=右边可以是一个数组常量或者常量、变量的数组。

访问数组元素直接索引数组下标,数组下标从0开始。
使用在有效范围之内的数组下标,也可以修改数组的元素值,使用区间运算符可以实现部分数组元素一并修改:

shoppingList[1...6] = ["Apples","Bananas"]
for item in shoppingList {
print(item + ",")
}
println()
与其称之为修改不如称之为替换,例子中将数组下标1到6闭区间的元素替换为等号右边的数组常量,输出为:Eggs,Apples,Bananas,Butter,对数组中间的元素进行了不等数目替换,数组总长度由8缩减为4。

我们可以用这个方法实现删除数组任意元素或元素段,或者在任意位置添加元素或元素段:

shoppingList[1...1] = []
shoppingList[1...1] = [shoppingList[1],"Coffee"]
但Swift给我们提供的简洁的方式实现元素的插入或删除,insert(atIndex:)方法实现元素插入,通过atIndex提供元素插入下标;removeAtIndex()方法实现删除指定下标的数组元素:

shoppingList.insert("Ice cream",atIndex: 0)
shoppingList.removeAtIndex(1)
removeLast( )方法实现删除数组最后一个元素。

2.3遍历数组
在之前的学习过程中我们已经很熟悉for-in循环实现数组遍历了,如果还想把数组排序和元素同时输出,除了count作半开半闭区间上界的原始的for循环,Swift还提供一种方式实现:

for (index, value) in enumerate(shoppingList) {
println("Item \(index + 1): \(value)")
}
标准全局函数enumerate( )将转化为下标和元素组成的二元元组。

2.4数组创建和初始化

创建一个空数组可以用完整形式Array<SomeType>,也可以用SomeType[ ]简化形式声明:

var someInts1 : Array<Int>
var someInts2 = Int[]()
除了用数组常量赋值,数组的构造函数提供一种初始化数组为一串重复值的重载 SomeType[ ](count: ,repeatedValue: ),举例如下:

var distance = Double[](count: 20, repeatedValue: 0.0)
或者直接不用指明元素类型:

var distance2 = Array(count: 20, repeatedValue: 0.0)


3.字典

字典可以看作一个储存许多同一数据类型的元素的容器,每个元素可以通过键[key]索引,字典就是键-值对的集合。
不像数组,字典是无序的。不像Objective-C的NSDictionary或者NSMutableDictionary可以使用任意类型作为键或者值,Swift的Dictionary遵循TypeSafe原则键和值的类型需要确定下来,要么用类型注释指出,要么通过推断得出类型。键的类型有唯一的约束:它必须是可哈希的[hashable],即每个键必须有独特代表性(所有Swift的基本类型均是hashable的,枚举类型同样默认是hashable的)。
注意: 上一句话翻译自The Swift Programming Language,“基本类型均为可哈希的”,但在我尝试过程中Xcode-beta不认为Character字符类型是可哈希的,因而字符类型暂时不能作为索引,以下代码是会报错的:
var characterCount = Dictionary<Character, Int>()


3.1字典常量

方括号中用逗号隔开如同[键:值]的键值对声明一个字典常量,字典常量常用于初始化字典:

var airports: Dictionary<String, String> = ["TYO": "Tokyo", "DUB": "Dublin"]
同样可以省略类型注释:

var airports: = ["TYO": "Tokyo", "DUB": "Dublin"]
3.2访问和修改字典

字典类型同样有count属性存放键值对个数。

由于字典是无序的,添加一个键值对十分简单:

airports["SHA"] = "Shanghai"
修改键值对的值也用同样方法:

airports["SHA"] = "Shanghai Hongqiao"
修改字典还有另一种方式,字典类型有一个updateValue(forKey: )的方法用于更新字典,该方法返回一个ValueType?可空类型的值,在键存在的情况下该可空类型的值为修改前的值,键不存在的情况下返回nil:

if let oldValue = airports.updateValue("Dublin International", forKey: "DUB") {
    println("The old value for DUB was \(oldValue).")
}


删除键值对也有两种方法:

airports["DUB"] = nil
airports.removeValueForKey("DUB")
removeValueForKey( )方法同updateValue( )返回一个ValueType可空类型的刚被删除的值。

3.3遍历字典

for-in配合元组遍历字典:

for (airportCode, airportName) in airports {
println("\(airportCode): \(airportName)")
}
字典有keys属性和values属性,它们分别为KeyType和ValueType的数组,通过遍历这两个数组也可以遍历字典。

3.4创建空字典

调用Dictionary的构造函数创建有类型的空字典[和数组有一定区别]:

var namesOfIntegers = Dictionary<Int, String>()
清空字典有简便的方法:

namesOfIntegers = [:]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: