数组
数组的简单语法
写swift数组应该遵循像Array<Element> 这样的形式,其中Element是这个数组中唯一允许存在的数据类型。我们也可以使用像[Element]这样的简单语法。尽管两种形式在功能上是一样的,但是推荐剪短的那种,而且在本文中都会使用这种形式来使用数组。
创建一个空数组
可以使用构造语法来创建一个由特定数据类型构成的空数组:
var someInts = [Int]()
通过构造函数的类型,someInts的值类型被推断为[Int]。
someInts = []
创建一个带有默认值的数组
swift中的Array类型还提供一个可以创建特定大小并且所有数据都被默认的构造方法。我们可以把准备加入新数组的数据项数量和适当类型的初始值传入数组构造函数:
var threeDoubles = Array(repeating:0,count:3)
通过两个数组相加创建一个数组
var anotherThreeDoubles = Array(repeating:2,count:3)
var sixDoubles = threeDoubles + anotherThreeDoubles
用数组字面量构造数组
var shoppingList:[String] = ["Eggs","Milk"]
由于swift的类型推断机制,还可以这样写:
var shoppingList = ["Eggs","Milk"]
访问和修改数组
可以使用数组的只读属性count来获取数组中的数据项的数量。使用布尔属性isEmpty作为一个缩写形式去检查count属性是否为0.
shoppingList.append("flour")
除此之外,使用加法赋值运算符也可以直接在数组后面添加一个或者多个拥有相同类型的数据项:
shoppingList += ["baking powder"]
可以用下标来改变某个已有索引值对应的数据值:
shoppingList[0] = "six eggs"
还可以利用下标一次改变一系列数据值,即使新数据和原有数据的数量不一样。
shoppingList[1...3] = ["bananas","apples"]
调用数组的insert(_:at:)方法来在某个具体的索引值之前添加数据项:
shoppingList.insert("maple", at: 0)
可以用remove(at:)方法来移除数组中的某一项。这个方法吧数组在特定索引值中存储的数据项移除并且返回这个被移除的数据项:
let maple = shoppingList.remove(at: 0)
数组的遍历
for item in shoppingList {
print(item)
}
如果同时需要每个数据项的值和索引值,可以使用enumerated()方法来进行数组遍历。enumerated()返回一个由每一个数据项索引值和数据值组成的元组。可以把这个元组分解成临时常量或者变量来进行遍历:
for (index,value) in shoppingList.enumerated() {
print("Item \(String(index + 1)):\(value)")
}
集合
集合类型语法
swift中的set类型被写为Set<Element>,这里的Element表示Set中允许存储的类型,和数组不同的是,集合没有等价的化简形式。
创建和构造一个空的集合
var letters = Set<Character>()
用数组字面量创建集合
var favoriteGenres:Set<String> = ["Rock","Classical","Hip hop"]
一个Set类型不能从数组字面量中被单独推断出来,因此Set类型必须显示声明。然而,由于swift的类型推断功能,如果你想使用一个数组字面量构造一个Set并且该数组字面量中的所有元素类型相同那么你无需写出Set的具体类型。
var favoriteGenres:Set = ["Rock","Classical","Hip hop"]
访问和修改一个集合
favoriteGenres.insert("Jazz")
可以通过调用Set的remove(_:)方法去删除一个元素,如果该值是该Set的一个元素则删除该元素并且返回被删除的元素值,否则如果该Set不包含该值,则返回nil。
let removedGenre = favoriteGenres.remove("Rock")
使用contains(_:)方法去检查Set中是否包含一个特定的值:
if favoriteGenres.contains("Funk") {
}
遍历一个集合
for genre in favoriteGenres {
}
swift的Set类型没有确定的顺序,为了按照特定顺序来遍历一个Set中的值可以使用sorted()方法,他将返回一个有序数组,这个数组的元素排列顺序由操作符<对元素进行比较的结果来确定。
for genre in favoriteGenres.sorted() {
}
集合操作
集合基本操作
使用intersection(_:)方法根据两个集合中都包含的值创建的一个新的集合。
使用symmetricDifference(_:)方法根据在一个集合中但不在两个集合中的值创建一个新的集合。
使用union(_:)方法根据两个集合的值创建一个新的集合。
let oddDigits:Set = [1,3,5,7,9]
let evenDigits:Set = [0,2,4,6,8]
let singleDigitPrimeNumers:Set = [2,3,5,7]
oddDigits.union(evenDigits).sorted()
oddDigits.intersection(evenDigits).sorted()
oddDigits.subtracting(singleDigitPrimeNumers).sorted()
oddDigits.symmetricDifference(singleDigitPrimeNumers).sorted()
集合成员关系和相等
使用“是否相等”运算符来判断两个集合是否包含全部相同的值。
使用isSubset(of:)方法来判断一个集合中的值是否也被包含另一个集合中。
使用isSuperset(of:)方法来判断一个集合中包含另一个集合中所有的值。
使用isStrictSubset(of:)或者isStrictSuperset(of:)方法来判断一个集合是否是另外一个集合的子集合或者父集合并且两个集合并不相等。
使用isDisjint(with:)方法来判断两个集合是否不含有相同的值。
let houseAnimals:Set = ["?","?"]
let farmAnimals:Set = ["?","?","?","?","?"]
let cityAnimals:Set = ["?","?"]
houseAnimals.isSubset(of: farmAnimals)
farmAnimals.isSuperset(of: houseAnimals)
farmAnimals.isDisjoint(with: cityAnimals
字典
字典类型简化语法
swift的字典使用Dictionary<Key,Value>定义,其中Key是字典中键的数据类型,Value是字典中对应于这些键所存储值的数据类型。我们也可以用[Key:Value]这样简化的形式去创建一个字典类型。虽然这两种形式功能上相同,但是后者是首选。
创建一个空字典
var namesOfIntegers = [Int: String]()
用字典字面量创建字典
var airports:[String:String] = ["YYZ":"Toronto","DUB":"Dublin"]
也可以这样:
var airports: = ["YYZ":"Toronto","DUB":"Dublin"]
因为这个语句中所有的键和值都各自拥有相同的数据类型,swift可以推断出Dictionary<String,String>是airports字典的正确类型。
访问和修改字典
可以通过字典的方法和属性来访问和修改字典,或者通过使用下标语法。可以通过字典的只读属性count来获取某个字典的数据项数量。使用布尔属性isEmpty作为一个缩写形式去检查count属性是否为0.
如果有值存在于更新前,则这个可选值包含了旧值,否则他将会是nil。
if let oldValue = airports.updateValue("Dublin Airport", forKey: "BUB")
{
}
也可以使用下标语法来在字典中检索特定键对应的值。因为有可能请求的键没有对应的值存在,字典的下标访问会返回对应值的类型的可选值。如果这个字典包含请求键所对应的值,下标会返回一个包含这个存在值的可选值,否则将返回nil。
if let airportName = airports["DUB"]{
}
此外,也可以用来在字典中移除键值对。
if let removedValue = airports.removeValue(forKey: "DUB"){
}
字典遍历
for (airportCode,airportName) in airports {
}
通过访问keys或者values属性,也可以变量字典的键或者值:
for airportCode in airports.keys {
}
for airportName in airports.values {
}
取自《the swift programming language》中文版