Swift2.1 语法指南——集合类型
2015-10-09 09:39
309 查看
原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/CollectionTypes.html#//apple_ref/doc/uid/TP40014097-CH8-ID105
Swift提供三种原始的集合类型:数组、集合、字典。
1、集合类型的可变性
一旦将集合类型声明为常量,其大小和内容都不能再变化。
2、数组
数组用于存储有序的同一类型的数据元素。
(1)数组的简写
数组类型的全写为:
可以简写为:[Element].
(2)创建空的数组
如果数组的类型已知,可用[]将其赋值为空数组。
(3)用默认的值来创建数组
(4)通过两个数组相加,创建一个数组
(5)通过字面值创建一个数组
由于有了类型推断,不必声明数组的类型:
(6)访问和修改数组
count属性得到数组的长度:
isEmpty属性判断数组是否为空:
append(_:)方法,在后面插入字符串:
也可以直接用+=运算符:
通过下标,访问数组中的元素:
通过下标,改变数组中的元素:
可以使用范围运算符改变一定范围下边内的数组元素:
注意:不能用下标在数组末尾添加新的元素.
插入元素:
移除元素:
如果移除最后一个元素,请使用removeLast()方法:
(7)遍历数组
如果既需要值,又需要下标,则使用
3、集合
集合用于存储值各不相同的同一类型的元素。
(1)元素的Hash值
要能够被存储在集合中,数据类型一定要hashable,也就是说该类型需提供一定方法来计算它的Hash值。Hash值是一种整型的数据,对于相等的所有对象而言,其Hash值是相同的。
如果a == b,则a.hashValue == b.hashValue。
Swift的基本类型
注意:你可以把自定义的类型用作Set的value类型或者Dictionary的key类型,只要它们实现Hashable协议。要实现Hashable协议,则该类型需要有一个gettable的名为hashValue的Int属性。该属性在不同程序或者同一程序的不同执行情况下不一定要返回相同的值。由于Hashable协议遵守了Equatable协议,所以也必须实现相等比较运算符(
(2)Set的声明
(3)创建并初始化一个空的Set
此外,如果Set已经明确类型,则可以用[]将Set赋为空:
(4)用数组字面量来声明一个Set
Set类型不能只由数组字面量来推断出,所以Set关键字必须显示地声明。由于数组的元素类型是可以推断出来的,Set的value类型可以不用显示声明。
(5)访问和修改Set
访问元素数量:
Set是否为空:
添加元素:
移除元素:
是否包含某个元素:
(6)遍历Set
以某种指定顺序遍历Set:
(7)Set运算
并集、交集、差集、异或
(8)Set之间的关系
4、字典
字典存储键值对,键的类型是一致的,值的类型是一致的。与数组不同,字典中的元素没有次序,只能用键来查询值。
(1)字典的简写
全写:Dictionary<Key, Value>,Key为键类型,Value为值类型。
简写:[Key: Value]
(2)创建空数组
[:]将已声明的字典赋值为空:
(3)用字面量创建字典
从字面量可以推断出Key和Value的类型,则两者不必显示声明:
(4)访问和修改字典
元素数目:
是否为空:
添加新元素:
改变某个元素:
也可以用
可以用下标的方法取出某个key对应的值,如果key不存在,则返回nil:
用下标方法移除某个键值对:
也可以用
(5)遍历字典
只取出key或value:
把key和value取作数组:
Swift中的字典是没有次序的,如果以某种次序遍历key或value,可以用keys或values属性的sort()方法对其排序。
Swift提供三种原始的集合类型:数组、集合、字典。
1、集合类型的可变性
一旦将集合类型声明为常量,其大小和内容都不能再变化。
2、数组
数组用于存储有序的同一类型的数据元素。
(1)数组的简写
数组类型的全写为:
Array<Element>,其中,Element是元素的类型。
可以简写为:[Element].
(2)创建空的数组
var someInts = [Int]() print("someInts is of type [Int] with \(someInts.count) items.") // prints "someInts is of type [Int] with 0 items."
如果数组的类型已知,可用[]将其赋值为空数组。
someInts.append(3) // someInts now contains 1 value of type Int someInts = [] // someInts is now an empty array, but is still of type [Int]
(3)用默认的值来创建数组
var threeDoubles = [Double](count: 3, repeatedValue: 0.0) // threeDoubles is of type [Double], and equals [0.0, 0.0, 0.0]
(4)通过两个数组相加,创建一个数组
var anotherThreeDoubles = [Double](count: 3, repeatedValue: 2.5) // anotherThreeDoubles is of type [Double], and equals [2.5, 2.5, 2.5] var sixDoubles = threeDoubles + anotherThreeDoubles // sixDoubles is inferred as [Double], and equals [0.0, 0.0, 0.0, 2.5, 2.5, 2.5]
(5)通过字面值创建一个数组
var shoppingList: [String] = ["Eggs", "Milk"] // shoppingList has been initialized with two initial items
由于有了类型推断,不必声明数组的类型:
var shoppingList = ["Eggs", "Milk"]
(6)访问和修改数组
count属性得到数组的长度:
print("The shopping list contains \(shoppingList.count) items.") // prints "The shopping list contains 2 items."
isEmpty属性判断数组是否为空:
if shoppingList.isEmpty { print("The shopping list is empty.") } else { print("The shopping list is not empty.") } // prints "The shopping list is not empty."
append(_:)方法,在后面插入字符串:
shoppingList.append("Flour") // shoppingList now contains 3 items, and someone is making pancakes
也可以直接用+=运算符:
shoppingList += ["Baking Powder"] // shoppingList now contains 4 items shoppingList += ["Chocolate Spread", "Cheese", "Butter"] // shoppingList now contains 7 items
通过下标,访问数组中的元素:
var firstItem = shoppingList[0] // firstItem is equal to "Eggs"
通过下标,改变数组中的元素:
shoppingList[0] = "Six eggs" // the first item in the list is now equal to "Six eggs" rather than "Eggs"
可以使用范围运算符改变一定范围下边内的数组元素:
shoppingList[4...6] = ["Bananas", "Apples"] // shoppingList now contains 6 items
注意:不能用下标在数组末尾添加新的元素.
插入元素:
shoppingList.insert("Maple Syrup", atIndex: 0) // shoppingList now contains 7 items // "Maple Syrup" is now the first item in the list
移除元素:
let mapleSyrup = shoppingList.removeAtIndex(0) // the item that was at index 0 has just been removed // shoppingList now contains 6 items, and no Maple Syrup // the mapleSyrup constant is now equal to the removed "Maple Syrup" string
如果移除最后一个元素,请使用removeLast()方法:
let apples = shoppingList.removeLast() // the last item in the array has just been removed // shoppingList now contains 5 items, and no apples // the apples constant is now equal to the removed "Apples" string
(7)遍历数组
for item in shoppingList { print(item) } // Six eggs // Milk // Flour // Baking Powder // Bananas
如果既需要值,又需要下标,则使用
enumerate()方法:
for (index, value) in shoppingList.enumerate() { print("Item \(index + 1): \(value)") } // Item 1: Six eggs // Item 2: Milk // Item 3: Flour // Item 4: Baking Powder // Item 5: Bananas
3、集合
集合用于存储值各不相同的同一类型的元素。
(1)元素的Hash值
要能够被存储在集合中,数据类型一定要hashable,也就是说该类型需提供一定方法来计算它的Hash值。Hash值是一种整型的数据,对于相等的所有对象而言,其Hash值是相同的。
如果a == b,则a.hashValue == b.hashValue。
Swift的基本类型
String,
Int,
Double, 和
Bool,默认都是hashable,可以用作Set的value类型或者Dictionary的key类型。没有关联值的枚举中的值也是默认hashable。
注意:你可以把自定义的类型用作Set的value类型或者Dictionary的key类型,只要它们实现Hashable协议。要实现Hashable协议,则该类型需要有一个gettable的名为hashValue的Int属性。该属性在不同程序或者同一程序的不同执行情况下不一定要返回相同的值。由于Hashable协议遵守了Equatable协议,所以也必须实现相等比较运算符(
==),== 的实现必须遵循以下要求:
a == a(Reflexivity)
a == bimplies
b == a(Symmetry)
a == b && b == cimplies
a == c(Transitivity)
(2)Set的声明
Set<Element>,其中,Element是元素的类型。
(3)创建并初始化一个空的Set
var letters = Set<Character>() print("letters is of type Set<Character> with \(letters.count) items.") // prints "letters is of type Set<Character> with 0 items."
此外,如果Set已经明确类型,则可以用[]将Set赋为空:
letters.insert("a") // letters now contains 1 value of type Character letters = [] // letters is now an empty set, but is still of type Set<Character>
(4)用数组字面量来声明一个Set
var favoriteGenres: Set<String> = ["Rock", "Classical", "Hip hop"] // favoriteGenres has been initialized with three initial items
Set类型不能只由数组字面量来推断出,所以Set关键字必须显示地声明。由于数组的元素类型是可以推断出来的,Set的value类型可以不用显示声明。
var favoriteGenres: Set = ["Rock", "Classical", "Hip hop"]
(5)访问和修改Set
访问元素数量:
print("I have \(favoriteGenres.count) favorite music genres.") // prints "I have 3 favorite music genres."
Set是否为空:
if favoriteGenres.isEmpty { print("As far as music goes, I'm not picky.") } else { print("I have particular music preferences.") } // prints "I have particular music preferences."
添加元素:
favoriteGenres.insert("Jazz") // favoriteGenres now contains 4 items
移除元素:
if let removedGenre = favoriteGenres.remove("Rock") { print("\(removedGenre)? I'm over it.") } else { print("I never much cared for that.") } // prints "Rock? I'm over it."
是否包含某个元素:
if favoriteGenres.contains("Funk") { print("I get up on the good foot.") } else { print("It's too funky in here.") } // prints "It's too funky in here."
(6)遍历Set
for genre in favoriteGenres { print("\(genre)") } // Classical // Jazz // Hip hop
以某种指定顺序遍历Set:
for genre in favoriteGenres.sort() { print("\(genre)") } // Classical // Hip hop // Jazz
(7)Set运算
并集、交集、差集、异或
let oddDigits: Set = [1, 3, 5, 7, 9] let evenDigits: Set = [0, 2, 4, 6, 8] let singleDigitPrimeNumbers: Set = [2, 3, 5, 7] oddDigits.union(evenDigits).sort() // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] oddDigits.intersect(evenDigits).sort() // [] oddDigits.subtract(singleDigitPrimeNumbers).sort() // [1, 9] oddDigits.exclusiveOr(singleDigitPrimeNumbers).sort() // [1, 2, 9]
(8)Set之间的关系
== 判断两个Set的元素是否完全相同。
isSubsetOf(_:)判断Set中的所有元素是否包含在另一Set中。
isSupersetOf(_:)判断Set是否包含另一Set的所有元素。
isStrictSubsetOf(_:)或者
isStrictSupersetOf(_:)判断set是否是另一Set的超集或子集,并且并不相等。
isDisjointWith(_:)判断两个Set是否有交集。
4、字典
字典存储键值对,键的类型是一致的,值的类型是一致的。与数组不同,字典中的元素没有次序,只能用键来查询值。
(1)字典的简写
全写:Dictionary<Key, Value>,Key为键类型,Value为值类型。
简写:[Key: Value]
(2)创建空数组
var namesOfIntegers = [Int: String]() // namesOfIntegers is an empty [Int: String] dictionary
[:]将已声明的字典赋值为空:
namesOfIntegers[16] = "sixteen" // namesOfIntegers now contains 1 key-value pair namesOfIntegers = [:] // namesOfIntegers is once again an empty dictionary of type [Int: String]
(3)用字面量创建字典
var airports: [String: String] = ["YYZ": "Toronto Pearson", "DUB": "Dublin"]
从字面量可以推断出Key和Value的类型,则两者不必显示声明:
var airports = ["YYZ": "Toronto Pearson", "DUB": "Dublin"]
(4)访问和修改字典
元素数目:
print("The airports dictionary contains \(airports.count) items.") // prints "The airports dictionary contains 2 items."
是否为空:
if airports.isEmpty { print("The airports dictionary is empty.") } else { print("The airports dictionary is not empty.") } // prints "The airports dictionary is not empty."
添加新元素:
airports["LHR"] = "London" // the airports dictionary now contains 3 items
改变某个元素:
airports["LHR"] = "London Heathrow" // the value for "LHR" has been changed to "London Heathrow"
也可以用
updateValue(_:forKey:)方法代替下标方法来更新某个元素的值。如果元素不存在,则该方法会创建这个元素。不同于下标方法,updateValue(_:forKey:)如果是更新元素的值,它会返回旧的元素值,这可以用来判断该元素是更新还是创建的。
updateValue(_:forKey:)返回的是元素值的可选型,如果更新,则该可选值有值,如果是新建的,则该可选值等于nil。
if let oldValue = airports.updateValue("Dublin Airport", forKey: "DUB") { print("The old value for DUB was \(oldValue).") } // prints "The old value for DUB was Dublin."
可以用下标的方法取出某个key对应的值,如果key不存在,则返回nil:
if let airportName = airports["DUB"] { print("The name of the airport is \(airportName).") } else { print("That airport is not in the airports dictionary.") } // prints "The name of the airport is Dublin Airport."
用下标方法移除某个键值对:
airports["APL"] = "Apple International" // "Apple International" is not the real airport for APL, so delete it airports["APL"] = nil // APL has now been removed from the dictionary
也可以用
removeValueForKey(_:)方法来移除元素:
if let removedValue = airports.removeValueForKey("DUB") { print("The removed airport's name is \(removedValue).") } else { print("The airports dictionary does not contain a value for DUB.") } // prints "The removed airport's name is Dublin Airport."
(5)遍历字典
for (airportCode, airportName) in airports { print("\(airportCode): \(airportName)") } // YYZ: Toronto Pearson // LHR: London Heathrow
只取出key或value:
for airportCode in airports.keys { print("Airport code: \(airportCode)") } // Airport code: YYZ // Airport code: LHR for airportName in airports.values { print("Airport name: \(airportName)") } // Airport name: Toronto Pearson // Airport name: London Heathrow
把key和value取作数组:
let airportCodes = [String](airports.keys) // airportCodes is ["YYZ", "LHR"] let airportNames = [String](airports.values) // airportNames is ["Toronto Pearson", "London Heathrow"]
Swift中的字典是没有次序的,如果以某种次序遍历key或value,可以用keys或values属性的sort()方法对其排序。
相关文章推荐
- Swift 解决IOS开发中TableView中编辑UITextField时键盘遮挡输入框的情况
- swift中的正则表达式小结
- iOS开发笔记--swift语法基础
- swift lazy 懒加载
- iOS8实现滑动TableViewCell自定义Actions-Swift基础教程
- swift UITableView cell自适应高度
- swift版支付宝解锁仿造
- 13.Swift CoreData
- swift版的StringAttribute
- Swift 细小知识点汇集
- Swift学习笔记(一):No such module 'Cocoa'
- Swift数据永久存储
- Swift 第十一课泛型
- Swift 协议
- swift开发笔记11 - 使用UIAlertController在底部弹出日期选择框
- ios swift开发中,使用键盘,tableview根据键盘调整高度
- 【Swift 2.0】实现简单弹幕功能
- swift之宏定义
- Swift惰性初始化(lazy)属性
- swift swizzle