Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
采用具有静态读写特性的协议的Swift结构不';不符合?_Swift_Protocols_Static Members - Fatal编程技术网

采用具有静态读写特性的协议的Swift结构不';不符合?

采用具有静态读写特性的协议的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是可读写的,所以我肯定满足了协议的精神 我还有一些补充意见:

为什么不在Swift 1.2中编译

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"