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
的结构中重新声明它。