Swift 为什么encode更喜欢静态属性而不是实例属性?

Swift 为什么encode更喜欢静态属性而不是实例属性?,swift,Swift,给定具有共享名称的静态和实例属性的结构: struct MyStruct{ //类型上的版本 静态let版本=1 //基于静态版本的实例上的版本 变量版本:Int=MyStruct.version } 如果我添加自定义Codable一致性,容器将倾向于静态而不是实例变量。例如: 扩展MyStruct:Codable{ func encode(到编码器:编码器)抛出{ var container=encoder.container(keyedBy:CodingKeys.self) 尝试conta

给定具有共享名称的静态和实例属性的结构:

struct MyStruct{
//类型上的版本
静态let版本=1
//基于静态版本的实例上的版本
变量版本:Int=MyStruct.version
}
如果我添加自定义
Codable
一致性,容器将倾向于静态而不是实例变量。例如:

扩展MyStruct:Codable{
func encode(到编码器:编码器)抛出{
var container=encoder.container(keyedBy:CodingKeys.self)
尝试container.encode(版本,forKey:.version)
}
枚举编码键:字符串,编码键{
案例版本
}
}
然后转到对实例进行编码:

让myStruct=myStruct(版本:2)
让我试试!JSONEncoder().encode(myStruct)
尝试JSONDecoder().decode(MyStruct.self,from:encoded)//MyStruct版本1
我可以通过使用self,
container.encode(self.version,forKey:.version)
来解决这个问题。但这不是重点


这很奇怪。为什么会这样

FWIW,我无法在Xcode 11测试版中重现这种行为。似乎这可能是一个已经修复的错误。我刚刚更新了。。。这似乎与是否设置了默认值有关。更奇怪的是,如果您尝试删除默认值,那么合成的初始值设定项就会中断…尝试删除实例变量上的默认值,您就会明白我的意思。但是,如果您更改静态变量的名称,那么一切都会按预期进行。嗯,即使使用更新的代码,当我在操场上运行它时,我也没有看到这种行为。你在使用Xcode 11 beta 2吗?@JoeSusnick-Ah-gotcha。据我所知,这是一个已经在最新版本的Xcode中修复的bug,所以我不会太担心它。