4.Swift-集合类型

来源:互联网 发布:网络歌曲串烧联唱 编辑:程序博客网 时间:2024/06/09 17:09

Swift中提供了两种集合类型:数组和字典。Swift语言里的数组和字典中存储的数据值类型必须明确。 这意味着我们不能把不正确的数据类型插入其中。 同时这也说明我们完全可以对获取出的值类型非常自信。 Swift对显式类型集合的使用确保了我们的代码对工作所需要的类型非常清楚,也让我们在开发中可以早早地找到任何的类型不匹配错误。

同样的,数组和字典是否可变,取决于你定义的时候是用的let还是var。

一、数组

Swift数组对存储数据有具体要求。 不同于 Objective-C的NSArray和NSMutableArray类,他们可以存储任何类型的实例而且不提供他们返回对象的任何本质信息。 在 Swift 中,数据值在被存储进入某个数组之前类型必须明确,方法是通过显式的类型标注或类型推断,而且不是必须是class类型。例如: 如果我们创建了一个Int值类型的数组,我们不能往其中插入任何不是Int类型的数据。 Swift 中的数组是类型安全的,并且它们中包含的类型必须明确。


1、创建方式

在Swift中完整的创建数组的写法是类似这样的:

var fullArray = Array<Int>()

但是也可以用另外一种简写的方式:

var shorthandArray = []

尽管两者是一样的作用,但是苹果推荐使用后者。


var shoppingList:[String] = ["Eggs","Milk"]创建了一个只能包含字符串类型的数组。

当数组创建的时候包含的值能明确的推断出它们的类型,就不需要写类型标示:var anotherShoppingList = ["Eggs","Milk"]


2、访问和修改数组

可以通过数组的方法和属性或者下标来访问和修改数组。


//访问数组元素

println("The shoppingList contains \(shoppingList.count) items.")


//判断数组是否为空

if anotherShoppingList.isEmpty{

    println("\(anotherShoppingList) is an empty array.")

}else{

    println("\(anotherShoppingList) is not an empty array.")

}


//添加元素

shoppingList.append("Flour")

shoppingList += ["Baking powder"]

shoppingList += ["Chocolate Spread","Cheese","Butter"] //一次性添加多个元素


//获取对应下标的元素

var firstItem = shoppingList[0] //或者 shoppingList.first


//修改对应下标的元素

shoppingList[0] = "Six eggs"


//修改一系列下标的元素,数量可以不对应

shoppingList[4...6] = ["Bananas","Apples"]//将数组中下标从4到6的三个元素换成 "Bananas"和"Apples"。


//删除元素

let deletedItem = shoppingList.removeAtIndex(0)//移除指定下标的元素,此方法会返回被移除的对象。

shoppingList.removeLast()   //移除最后一个元素

shoppingList.removeRange(Range(start: 1,end: 2))    //删除指定区间的元素

shoppingList.removeAll(keepCapacity: true)  //移除所有元素并保留数组的容量


3、数组遍历

//for-in

for item in shoppingList{

    println(item)

}

//迭代获取元素的下标和元素内容

//enumerate方法会返回一个包含下标和元素值的元组。

for (index,value) in enumerate(shoppingList){

    println("shoppingList[\(index)] = \(value)")

}


4、创建并初始化数组

var someInts = [Int]()


如果上下文已经提供了数组类型信息,例如一个函数或者一个已经定义好的类型的常量或者变量,我们可以利用空数组语句创建一个空数组,数组的类型保持不变

someInts.append(12)

someInts = []   //此时数组变空,但是类型还是Int类型

//someInts.append("2") //再尝试往里面添加其他类型的数据是不合法的。



Swift还支持创建一个确定容量并且拥有默认值的数组。

var threeDoubles = [Double](count: 3, repeatedValue: 0.0)


还可以通过两个数组相加来创建一个新的数组,前提是两个数组类型一致。

var anotherThreeDoubles = [Double](count: 3, repeatedValue: 1.0)


var sixDoubles = threeDoubles + anotherThreeDoubles


//注意: 在我们不需要改变数组大小的时候创建不可变数组是很好的习惯。如此 Swift 编译器可以优化我们创建的集合。


二、字典

Swift 的字典使用时需要具体规定可以存储键和值类型。不同于 Objective-C 的NSDictionary和NSMutableDictionary 类可以使用任何类型的对象来作键和值并且不提供任何关于这些对象的本质信息。在 Swift 中,在某个特定字典中可以存储的键和值必须提前定义清楚,方法是通过显性类型标注或者类型推断。

在Swift中标准的创建字典的方式是这样的:var fullDict = Dictionary<Int,String>()但是推荐使用这样的:var shorthandDict = [Int:String]()。同样的,可变与不可变取决于定义的时候用let还是var。

1、创建方式

var fullDict = Dictionary<Int,String>()

var shorthandDict = [Int:String]()  //推荐使用


var airports:[String:String] = ["XYZ":"Toronto Pearson","DUB":"Dublin"]

//当键和值的类型都一样的时候,可以简写为:

var airports1 = ["XYZ":"Toronto Pearson","DUB":"Dublin"]


2、访问和修改字典

//可以通过字典的方法或者属性或者下标来访问和修改字典

println("The airpots dictionary contains \(airports.count) items.")


if airports.isEmpty{

    println("The airpots dictionary is empty.")

}else{

    println("The airpots dictionary is not empty.")

}


//通过下标插入元素  用一个合法的新键作为下标,并新增一个合法的值。

airports["LHR"] = "London"


//通过下标修改对应的值

airports["LHR"] = "London Heathrow"


//updateValue(forKey:)返回一个可选字符串类型,如果字典中存在key对应的值,就返回旧的值,否则返回nil。

if let oldValue = airports.updateValue("Dublin Airport", forKey: "DUB"){

    println("The oldValue for the DUB is \(oldValue)")

}else{

    println("There is not a value for DUB")

}


//通过键获取字典中对应的值的方法返回值也是可选字符串类型,如果字典中存在这对应的值,就返回值,否则返回nil。

if let airportName = airports["DUB"]{

    println("The name of the airport is \(airportName)")

}else{

    println("That airport is not in the airports dictionary.")

}


//可以通过给对应的键的值赋值为nil来删除键值对。

airports["APL"] = "Apple International"

airports["APL"] = nil


//可以通过emoveValueForKey()方法删除对应的键值对。如果值存在则返回对应的值,否则返回nil。

if let removedValue = airports.removeValueForKey("DUB"){

    println("The removed airport's name is \(removedValue)")

}else{

    println("The airports dictionary does not contain a value for DUB.")

}


//删除字典的所有键值对

//airports.removeAll(keepCapacity: true)


3、字典遍历

//for-in

for(airportCode,airportName) in airports{

    println("\(airportCode):\(airportName)")

}


for airportCode in airports.keys{

    println("AirportCode:\(airportCode)")

}


for airportName in airports.values{

    println("AirportName:\(airportName)")

}


//获取所有的键或者值

let airportCodes = [String](airports.keys)

let airportNames = [String](airports.values)


注意: Swift 的字典类型是无序集合类型。其中字典键,值,键值对在遍历的时候会重新排列,而且其中顺序是不固定的。


4、创建空的字典

var namesOfIntegers = [Int:String]()

//如果上下文已经提供了字典类型信息,那么就可以用[:]来创建一个空的字典

namesOfIntegers[16] = "sixteen"

namesOfIntegers = [:]//此时空字典的类型已经确定,键为整形,值字符串类型


注意:字典的键必须是可以hash的,我们常用的Int,String,Double和Bool类型都支持hash.


总结:

Swift中的数组和字典跟OC中的数组和字典在概念上是没有区别的,但是一些特性和用法上跟OC差别很大。差别总结如下:

1、Swift中的数组的元素类型和字典的键值类型必须是明确的类型,类型一旦明确,就不能再加入非此类型的其他数据进来了,这样我们就很明确了我们操作的数据类型,这在源头上减少了不合法数据,所以说Swift的数组和字典是类型安全的。而OC中的数组中可以放任意类型的数据,OC中的字典的键值的类型也可以不全是固定的类型。

2、数组和字典可不可变取决于定义的时候是用的var还是let。而OC中是用NSMutableArray和NSMutableDictionary来表示可以数组和字典的。

3、Swift中的数组操作非常的简单,直接用+、+=或者append方法就可以往已有的数组中添加元素。还可以通过下标来访问对应的元素。而且 shoppingList[4...6] = ["Bananas","Apples"]这种语法也显得非常的灵活。

4、Swift支持直接用+来连接两个已有的数组的方式来创建新的数组。

5、Swift中数组和字典,只要上下文有表示数组和字典的数据类型,就可以用非常简洁的语句来创建一个新的空的数组或者字典,而不用再指定它们的数据类型,这一点也显得非常的神奇。

总之,感觉Swift在语法上比OC确实简洁和先进了很多,没有OC那么繁琐的语句了,比如数组直接可以用+、+=添加元素,还可以直接用+连接两个数组。在一定程度上减少了程序猿们的代码量。


参考:

1.The Swift Programming Language

2.http://www.cocoachina.com/ios/20140611/8768.html

0 0