必须相同,比如a==b,因此必须a.hashValue == b.hashValue。
集合类型的哈希值
一个类型为了存储在集合中,该类型必须是可哈希化的--也就是说,该类型必须提供一个方法来计算它的哈希值。一个哈希值是Int类型的,相等的对象哈希值必须相同,比如a==b,因此必须a.hashValue == b.hashValue。
var letters = Set<Character>() // 创建和构造一个空的集合
letters = [] // letters 现在是一个空的 Set, 但是它依然是 Set<Character> 类型
var favoriteGenres: Set<String> = ["Rock", "Classical", "Hip hop"]
一般操作
一个Set类型不能从数组字面量中被单独推断出来,因此Set类型必须显式声明。然而,由于 Swift 的类型推断功能,如果你想使用一个数组字面量构造一个Set并且该数组字面量中的所有元素类型相同,那么你无须写出Set的具体类型
var favoriteGenres: Set = ["Rock", "Classical", "Hip hop"]
你可以通过调用Set的insert(_:)
方法来添加一个新元素,你可以通过调用Set的remove(_:)
方法去删除一个元素,如果该值是该Set的一个元素则删除该元素并且返回被删除的元素值,否则如果该Set不包含该值,则返回nil。另外,Set中的所有元素可以通过它的removeAll()
方法删除。使用contains(_:)
方法去检查Set中是否包含一个特定的值,你可以在一个for-in循环中遍历一个Set中的所有值。
集合比较
- 使用
intersect(_:)
方法根据两个集合中都包含的值创建的一个新的集合。
- 使用
exclusiveOr(_:)
方法根据在一个集合中但不在两个集合中的值创建一个新的集合。
- 使用
union(_:)
方法根据两个集合的值创建一个新的集合。
- 使用
subtract(_:)
方法根据不在该集合中的值创建一个新的集合。
字典
字典是一种存储多个相同类型的值的容器。每个值(value)都关联唯一的键(key),键作为字典中的这个值数据的标识符。和数组中的数据项不同,字典中的数据项并没有具体顺序
字典类型快捷语法
Swift 的字典使用Dictionary
定义,我们也可以用[Key: Value]这样快捷的形式去创建一个字典类型。虽然这两种形式功能上相同,但是后者是首选,并且这本指导书涉及到字典类型时通篇采用后者。
和数组一样,我们在用字典字面量构造字典时,如果它的键和值都有各自一致的类型,那么就不必写出字典的类型。
创建一个空字典
我们可以像数组一样使用构造语法创建一个拥有确定类型的空字典:
var namesOfIntegers = [Int: String]() // namesOfIntegers 是一个空的 [Int: String] 字典
这个例子创建了一个[Int: String]类型的空字典来储存整数的英语命名。它的键是Int型,值是String型。
如果上下文已经提供了类型信息,我们可以使用空字典字面量来创建一个空字典,记作[:](中括号中放一个冒号):
namesOfIntegers[16] = "sixteen"
// namesOfIntegers 现在包含一个键值对
namesOfIntegers = [:]
// namesOfIntegers 又成为了一个 [Int: String] 类型的空字典
用字典字面量创建字典
我们可以使用字典字面量来构造字典,这和我们刚才介绍过的数组字面量拥有相似语法。字典字面量是一种将一个或多个键值对写作Dictionary集合的快捷途径。
一个键值对是一个key和一个value的结合体。在字典字面量中,每一个键值对的键和值都由冒号分割。这些键值对构成一个列表,其中这些键值对由方括号包含、由逗号分割:
[key 1: value 1, key 2: value 2, key 3: value 3]
iocoresurfaceroot
控制流
Swift 的switch语句比 C 语言中更加强大。在 C 语言中,如果某个 case 不小心漏写了break,这个 case 就会贯穿至下一个 case,Swift 无需写break,所以不会发生这种贯穿的情况,但你仍然可以在末尾写入break,来正常或提前结束。case 还可以匹配更多的类型模式,包括区间匹配(range matching),元组(tuple)和特定类型的描述。switch的 case 语句中匹配的值可以是由 case 体内部临时的常量或者变量决定,也可以由where分句描述更复杂的匹配条件。
For-In 循环
如果你不需要知道区间序列内每一项的值,你可以使用下划线(_)替代变量名来忽略对值的访问:
let base = 3
let power = 10
var answer = 1
for _ in 1...power {
answer *= base
}
repeat-while循环合其他语言中的do-while循环是类似的
switch语句必须是完备的,即必须有default分支,除非是字面常量,否则报错,如下:
switch 10 {
case 10:
print("10")
}
/// 或者是穷举枚举类型也可以不用default
另外,可以有多个匹配,如果有多个匹配则只执行第一个,break语句是跳出当前循环,或者是跳出switch分支,因此在其它地方使用swift中会报错,而continue只允许在循环里面使用。每个分支必须至少有一条执行语句,包括default分支
如果你确实需要 C 风格的贯穿的特性,你可以在每个需要该特性的 case 分支中使用fallthrough关键字,将自动执行下一个分支.
标签语句
在 Swift 中,你可以在循环体和switch代码块中嵌套循环体和switch代码块来创造复杂的控制流结构。然而,循环体和switch代码块两者都可以使用break语句来提前结束整个方法体。因此,显式地指明break语句想要终止的是哪个循环体或者switch代码块,会很有用。类似地,如果你有许多嵌套的循环体,显式指明continue语句想要影响哪一个循环体也会非常有用。
labelName: while condition { statements }
gameLoop: while square != finalSquare {
switch square + diceRoll {
case finalSquare:
break gameLoop // 跳出while循环
case let newSquare where newSquare > finalSquare:
continue gameLoop // 开始新的while循环
}
}
检测 API 可用性
if #available(iOS 9, OSX 10.10, *) {
// 在 iOS 使用 iOS 9 的 API, 在 OS X 使用 OS X v10.10 的 API
} else {
// 使用先前版本的 iOS 和 OS X 的 API
}
以上可用性条件指定在 i