为什么在协议中声明readonly属性?

如果我们可以通过类或结构设置值,为什么在协议中声明readonly属性? 我无法理解这个用法。 在“The Swift Programming Book”2.0版中

“如果协议只要求一个属性可以获取,那么任何类型的属性都可以满足要求,如果这对你自己的代码有用,那么属性也可以设置。”

因此它不能从类/结构外部设置。 想象一下,你的API返回了一个具有get和set属性的协议实例(在你的协议中),那么任何得到这个实例的人都可以设置这个值!

get和set属性也不能是常量:

protocol RWProt { var value : Int { get set } } // Error: Type 'Value' does not conform to protocol 'RWProt' struct Value : RWProt { let value = 0 } 

但这有效:

 protocol Read { var value : Int { get } } struct Value : Read { var value = 0 mutating func change() { value++ } } 

协议只需要值可获取,因此获取协议属性不仅仅是get,而是get或set

好的,这是另一个例子:

 import Foundation public protocol ExternalInterface { var value : Int { get } } private struct PrivateStuff : ExternalInterface { var value = 0 mutating func doSomePrivateChangingStuff() { value = Int(arc4random()) } } public func getInterfaceToPrivateStuff() -> ExternalInterface { var stuff = PrivateStuff() stuff.doSomePrivateChangingStuff() return stuff } // In another file: let interfaceToSomethingICantChange = getInterfaceToPrivateStuff() // error: cannot assign to property: 'value' is a get-only property interfaceToSomethingICantChange.value = 0