Swift进阶

Error Handling

  • Swift的Error是一个协议, 你可以定义自己的错误类型, 只要实现这个协议即可
  • Error协议有一个localizedDescription属性, 返回一个String, 用于描述错误信息
  • LocalizedError协议继承自Error, 并且有一个errorDescription属性, 返回一个String, 用于描述错误信息

Collection Protocols

Sequence

  • Sequence 是一个协议, ⼀个序列 (sequence) 代表的是⼀系列具有相同类型的值,你可以对这些值进⾏迭代。
  • Sequence 的实例必须实现一个 makeIterator() 方法, 返回一个 Iterator 类型的实例
  • Iterator 是一个协议, 它的实例必须实现一个 next() 方法, 返回一个可选的 Element 类型
protocol IteratorProtocol {
    associatedtype Element
    mutating func next() -> Element?
}

前面说的Iterator.Item的来源就在于此, 编译器对for循环干的事其实是创建一个新的迭代器, 然后再循环调用它的next方法, 直到返空:

var iterator = someSequence.makeIterator()
while let element = iterator.next() {
    doSomething(with: element)
}

这是一个永不枯竭的序列:

struct ConstantIterator: IteratorProtocol {
    typealias Element = Int
    mutating func next() -> Int? {
        return 1
    }
}

这里是为了演示下实现自己的IteratorProtocol时的写法, 其中typealias那一行不是必须的, 但是更具有可读性. 事实上你只要next()有东西返回就行了.

struct FibsIterator: IteratorProtocol {
    var state = (0, 1)
    mutating func next() -> Int? {
        let upcomingNumber = state.0
        state = (state.1, state.0 + state.1)
        return upcomingNumber
}}

这个例子更实用, 因为它实现了斐波那契数列的迭代器, 同时演示了为什么要mutating, 因为大多数情况下, 你的迭代器是带状态的, 本例中, 就是不断更新state的值.

在合适的场景返回nil就是一个有限的序列了