不能在协议中分配属性 – Swift编译器错误

在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" 

我敢肯定,这是简单的,我忽略了 – 我做错了什么?

@亚光的味道是正确的。

另一个解决scheme是声明Nameable 仅有class协议 。

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

我认为,这个解决scheme更适合这种情况。 因为nameNameable是无用的,除非可nameableclass一个实例。

这是因为,Nameable是一个协议,Swift不知道你的函数的传入Nameable是什么types (风味)。 它可能是一个类实例,当然 – 但它可能是一个结构实例。 你不能指定一个常量结构的属性,如下例所示:

 struct NameableStruct : Nameable { var name : String = "" } let ns = NameableStruct(name:"one") ns.name = "two" // can't assign 

那么,默认情况下,一个传入的函数参数一个常量,就像你在声明之前已经说过let你的函数声明nameable

解决办法是使这个参数不是一个常量:

 func nameNameable(var nameable: Nameable, name: String ) { ^^^ 

在这里,我写了一些代码,这可能会给关于关联genericstypes的一些想法用法:

 protocol NumaricType { typealias elementType func plus(lhs : elementType, _ rhs : elementType) -> elementType func minus(lhs : elementType, _ rhs : elementType) -> elementType } struct Arthamatic :NumaricType { func addMethod(element1 :Int, element2 :Int) -> Int { return plus(element1, element2) } func minusMethod(ele1 :Int, ele2 :Int) -> Int { return minus(ele1, ele2) } typealias elementType = Int func plus(lhs: elementType, _ rhs: elementType) -> elementType { return lhs + rhs } func minus(lhs: elementType, _ rhs: elementType) -> elementType { return lhs - rhs } } **Output:** let obj = Arthamatic().addMethod(34, element2: 45) // 79