【发布时间】:2015-11-21 22:26:49
【问题描述】:
如果我们可以通过类或结构设置值,为什么还要在协议中声明只读属性?我无法理解这个的用法。 在《The Swift Programming Book》2.0版中
“如果协议只要求某个属性是可获取的,那么任何类型的属性都可以满足该要求,并且如果这对您自己的代码有用,那么该属性也可设置是有效的。”
【问题讨论】:
如果我们可以通过类或结构设置值,为什么还要在协议中声明只读属性?我无法理解这个的用法。 在《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的,所以getprotocols属性不是get only而是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
【讨论】: