我在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 }
}
我认为,这种解决方案更适合这种情况。因为除非
nameNameable
是nameable
的实例,否则class
是无用的。