如果我们可以通过类或结构设置值,为什么在协议中声明readonly属性?我无法理解这个用法。 在“The Swift Programming Book”2.0版
中“如果协议只要求一个属性可以获取,那么任何类型的属性都可以满足要求,如果这对你自己的代码有用,那么属性也可以设置。”
答案 0 :(得分:3)
因此它不能从类/结构外部设置。想象一下,你的API返回了一个具有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++
}
}
协议只需要值可获取,因此获取协议属性不仅仅是获取或设置
好的,这是另一个例子:
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