1.将protocol的方法申明为 mutating:
mutating关键字用于修饰protocol中的方法
在Swift中protocol不仅可以被class遵守,还可以被struct、enum实现,protocol中的方法前面加入了该关键字,那么在该方法的实现中可以修改struct和enum中的成员变量,如果协议方法里没有写mutating,别人用的话就不能在方法里改变自己的变量了。在class中是默认可以修改的
//1.将protocol的方法申明为mutating
/*
mutating 关键字修饰方法是为了能在该方法中修改struct或是enum的变量
*/
protocol Vehicle {
var numberofWheels: Int {get}
var color: UIColor {get set}
mutating func changeColor(_ color: UIColor)
}
struct Mycar: Vehicle {
let numberofWheels = 4
var color: UIColor = UIColor.blue
mutating func changeColor(_ color: UIColor) {
self.color = color
}
}
2. Sequence
//先定义了一个实现了IteratorProtocol 协议的类型
//IteratorProtocol 需要指定一个typealias Element
//以及提供一个返回 Elemnt? 的方法 next()
//实现一个反向的iterator和sequence
class ReverseIterator<T>: IteratorProtocol {
typealias Element = T
var array: [Element]
var currentIndex = 0
init(array: [Element]) {
self.array = array
currentIndex = array.count - 1
}
func next() -> Element? {
guard currentIndex >= 0 else {
return nil
}
let element = array[currentIndex]
currentIndex -= 1
return element
}
}
//定义Sequence
//指定一个typealias Iterator
//以及提供一个返回Iterator?的方法 makeIterator
struct ReverseSequence<T>: Sequence {
var array: [T]
init(array: [T]) {
self.array = array
}
typealias Iterator = ReverseIterator<T>
func makeIterator() -> ReverseIterator<T> {
return ReverseIterator(array: self.array)
}
}
let arr = [0,1,2,3,4]
for i in ReverseSequence(array: arr) {
print("Index: \(i) is \(arr[i])")
}