Swift 采用静态读写协议的结构 属性 不符合?
Swift struct adopting protocol with static read-write property doesn't conform?
为什么不能在 Swift 1.2 中编译?
protocol Proto {
static var name : String {get set}
}
struct Struct : Proto {
static var name : String = "name"
}
(在 Swift 1.1 中,只需将协议声明中的 static
替换为 class
。同样的问题。)
编译器抱怨我不符合协议。但为什么我不是?很容易证明 Struct 中的 static 属性 name
是 可读可写的,所以我已经满足了协议的精神,当然。
我有一些额外的观察:
如果我从协议要求中删除 set
,问题就会消失。
如果我保留 set
,但我从协议要求和 static
中删除了 static
(或 class
)从 Struct 实现中,问题就消失了。
如果我保留 static
并将存储变量转换为计算变量,问题就会消失。
如果我将结构更改为 class,问题就会消失。
但我并没有更深入地了解编译器不喜欢我所拥有的东西。为什么静态存储 属性 不满足协议要求?
在这一点上,我被 Nate Cook 的例子说服了,这只不过是 Swift 编译器中的一个错误。正如他指出的那样,仅在静态变量上添加一个空的 didSet
观察器就可以编译代码。尽管这没有 功能性 差异,但它可能会有所作为,这一事实已经 "bug" 写满了它。
母舰固定在 6.3 (6D543q):
protocol Proto {
static var name : String {get set}
}
struct Struct : Proto {
static var name : String = "name"
}
Struct.name = "Frodo"
println(Struct.name)
现在有效:
-> "Frodo"
(在游乐场测试)
它确实看起来像 static 被视为 let / const 变量,但你的案例现在在 6.3 Beta 3 中工作。我很高兴 lldb 符号没有被破坏。
为什么不能在 Swift 1.2 中编译?
protocol Proto {
static var name : String {get set}
}
struct Struct : Proto {
static var name : String = "name"
}
(在 Swift 1.1 中,只需将协议声明中的 static
替换为 class
。同样的问题。)
编译器抱怨我不符合协议。但为什么我不是?很容易证明 Struct 中的 static 属性 name
是 可读可写的,所以我已经满足了协议的精神,当然。
我有一些额外的观察:
如果我从协议要求中删除
set
,问题就会消失。如果我保留
set
,但我从协议要求和static
中删除了static
(或class
)从 Struct 实现中,问题就消失了。如果我保留
static
并将存储变量转换为计算变量,问题就会消失。如果我将结构更改为 class,问题就会消失。
但我并没有更深入地了解编译器不喜欢我所拥有的东西。为什么静态存储 属性 不满足协议要求?
在这一点上,我被 Nate Cook 的例子说服了,这只不过是 Swift 编译器中的一个错误。正如他指出的那样,仅在静态变量上添加一个空的 didSet
观察器就可以编译代码。尽管这没有 功能性 差异,但它可能会有所作为,这一事实已经 "bug" 写满了它。
母舰固定在 6.3 (6D543q):
protocol Proto {
static var name : String {get set}
}
struct Struct : Proto {
static var name : String = "name"
}
Struct.name = "Frodo"
println(Struct.name)
现在有效:
-> "Frodo"
(在游乐场测试) 它确实看起来像 static 被视为 let / const 变量,但你的案例现在在 6.3 Beta 3 中工作。我很高兴 lldb 符号没有被破坏。