采用具有静态读写特性的协议的Swift结构不';不符合?
为什么不在Swift 1.2中编译采用具有静态读写特性的协议的Swift结构不';不符合?,swift,protocols,static-members,Swift,Protocols,Static Members,为什么不在Swift 1.2中编译 protocol Proto { static var name : String {get set} } struct Struct : Proto { static var name : String = "name" } (在Swift 1.1中,只需在协议声明中用类替换静态。同样的问题。) 编译器抱怨我不符合协议。但为什么我不是?很容易证明Struct中的静态属性name是可读写的,所以我肯定满足了协议的精神 我还有一些补充意见:
protocol Proto {
static var name : String {get set}
}
struct Struct : Proto {
static var name : String = "name"
}
(在Swift 1.1中,只需在协议声明中用类
替换静态
。同样的问题。)
编译器抱怨我不符合协议。但为什么我不是?很容易证明Struct中的静态属性name
是可读写的,所以我肯定满足了协议的精神
我还有一些补充意见:
- 如果我从协议要求中删除
,问题就会消失集合
- 如果我将
设置保持在原位,但我从协议要求中删除了
(或静态
),从结构实现中删除了类
,那么问题就消失了静态
- 如果我将
保持在原位,并将存储的变量转换为计算变量,问题就会消失静态
- 如果我将结构更改为类,问题就会消失
但我还没有进一步了解编译器对我所得到的东西有什么不喜欢的地方。为什么静态存储属性不能满足协议要求?在这一点上,Nate Cook的例子说服了我,这只是Swift编译器中的一个bug。正如他所指出的,只需在静态变量上添加一个空的
didSet
observer,代码就可以编译。这可能会带来不同,即使它没有功能上的差异,但这一事实已经将“bug”写满了它。母舰在6.3(6D543q)中修复:
现在工作:
-> "Frodo"
(在操场测试)
看起来static确实被视为let/const变量,但您的案例现在可以在6.3 Beta 3中使用。我很高兴lldb符号是完整的。我觉得这好像是编译器中的一个bug。如果您使用
class
而不是struct
,它在Swift 1.2As上工作:class struct:Proto{static var name:String=“w00t”}
是的,我在问题(第四个项目)中说了这一点。现在告诉我什么我还不知道!:)-我很难相信这是一只虫子。如果是的话,它会很旧,我希望它现在已经被修复了。我投编译器错误的票。列表中的另一个要点是:即使添加一个空的didSet
property observer也可以解决这个问题。你已经知道了,对吧?
-> "Frodo"