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就是一个有限的序列了