Swift协议扩展:无法分配给属性:'';是一个只能获取的属性

Swift协议扩展:无法分配给属性:'';是一个只能获取的属性,swift,Swift,我想我不明白协议扩展应该如何工作 我试过这个: protocol P { var h: [String: Any] { set get } } extension P { var h: [String: Any] { get { return [:] } set {} } } struct S: P { init() { self.h = ["o": "o"]

我想我不明白协议扩展应该如何工作

我试过这个:

protocol P {
    var h: [String: Any] { set get }
}

extension P {
    var h: [String: Any] {
        get {
            return [:]
        }
        set {}
    }
}

struct S: P {   
    init() {
        self.h = ["o": "o"]
    }
}
我的目标是
S
具有
p
的属性,并且不需要在结构定义中重新声明它

但是,当我创建
时,让s=s()
s.h
始终等于
[:]
,而不是
[“o”:“o”]

当然,这是因为我的二传手是空的,但我不知道如何在这里实现我想要实现的目标

谢谢你的帮助

我的目标是S具有p的属性,并且不需要在结构定义中重新声明它

你这样做是不可能的。协议需要特定的行为。一致性类型必须提供这些行为。如果您需要存储来实现该行为,则合格类型必须提供存储

如果您不需要存储,那么扩展就可以像您的一样返回值。但是,您不能返回计算值,而且还具有存储空间。你想做的是不可能的。你想到的是类,而不是协议。(如果你想要类,那很好。使用类。它们没有错。)

<> P>一个很好的方法来思考为什么在SWIFT中不可能的是考虑下面的情况。假设您的
P
协议以某种形式存在,可以实现您想要的。现在,我们在一个模块中定义:

struct S {}
此结构不需要存储。在该模块中对
S()
的任何调用都不会分配任何内容。(或者,给
S
一些属性,它将分配一些特定的内存量。)

现在在其他模块中,扩展
S
以符合
p

extension S: P {}

h
的存储空间在哪里?实例可能已经存在于加载此扩展的位置。如果有多个协议需要额外存储,并且所有协议都连接到
S
,该怎么办。这些属性应该是
S
结构中的哪些偏移?顺序对于已编译的代码非常重要。这不是不可能解决的问题(ObjC使用一种称为关联对象的技术来解决),但它是对语言的一个很大的补充,阻止了许多重要的优化,Swift并没有这样做。

如果你很接近,你只需在s结构中重述h变量

protocol P {
    var h: [String: Any] { set get }
}

extension P {
    var h: [String: Any] {
        get {
            return [:]
        }
        set {}
    }
}

struct S: P {
    var h: [String: Any]

    init() {
        self.h = ["o": "o"]
    }
}

let s = S()
print(s.h) // ["o": "o"]

创建一个问题,然后自己回答以获得分数是不好的。这是对系统的挑战。虽然我们当然是隐藏的标识符,共享一个名称而不是身份,但StackOverflow谢天谢地鼓励您提出问题并自己回答。这是一个很好的方式来分享你学到的东西。老师,我真的是在开玩笑。我已经回答了不少问题。下次我会用表情符号来澄清我的意图。好吧,首先,好的一个@亲爱的!当然罗布·纳皮尔和我不是同一个人。非常感谢您的详细解释。现在更有意义了。您好,威尔逊,谢谢您的回答,但是如果您仔细阅读,我实际上是在问我是否可以设置
h
变量,而不必在符合
P
的结构中重新声明它。