这是一个简单的用例:
protocol Debuggable {
var _d: String -> () {
get set
}
}
class Debugger {
class func attach(instance: Debuggable) {
let d = Debugger()
instance._d = d.d // This doesn't work
}
func d(message: String) {
println(message)
}
}
编译时的错误消息:虽然我的协议使用getter和setter定义var,但无法在实例中分配给_d。
答案 0 :(得分:3)
这是编译器为您捕获错误的好例子:)
instance
可以是值类型,因此可以复制到此方法中。在这种情况下,您将修改副本并将其丢弃。最快的解决方法是将其定义为inout
参数:
class func attach(inout instance: Debuggable) {
let d = Debugger()
instance._d = d.d
}
我认为最好还是返回实例:
class func attach(instance: Debuggable) -> Debuggable {
let d = Debugger()
var ret = instance
ret._d = d.d
return ret
}
我觉得inout
主要是用于向后兼容Objective-C和C的语言。让类型确定是否应该复制它而不是强制它通过引用传递。如果将某些内容定义为值类型,则有充分的理由。