分配给Protocol中定义的var表示它无法分配给它

时间:2014-06-16 01:23:39

标签: swift

这是一个简单的用例:

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。

1 个答案:

答案 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的语言。让类型确定是否应该复制它而不是强制它通过引用传递。如果将某些内容定义为值类型,则有充分的理由。