不能在协议中分配属性 – 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
是无用的,除非可nameable
是class
一个实例。
这是因为,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