我在Swift中使用以下代码将头撞墙。我定义了一个简单的协议:

protocol Nameable {
    var name : String { get set }
}


并通过以下方式实施:

class NameableImpl : Nameable {
    var name : String = ""
}


然后我在另一个文件中有以下方法(不要问我为什么):

func nameNameable( nameable: Nameable, name: String ) {
    nameable.name = name
}


问题在于,在此方法中,编译器会为属性分配给出以下错误:


  无法在“可命名”中分配给“名称”


我看不到我在做什么错...以下代码可以正常编译:

var nameable : Nameable = NameableImpl()
nameable.name = "John"


我敢肯定,这是我忽略了的简单事情-我在做什么错?

最佳答案

@matt的答案是正确的。
另一种解决方案是将Nameable声明为class only protocol

protocol Nameable: class {
//               ^^^^^^^
    var name : String { get set }
}

我认为,这种解决方案更适合这种情况。因为除非nameNameablenameable的实例,否则class是无用的。

10-05 18:34