Accessor仅在Swift 1.2 / 2.0 Release版本中提供了错误的值
我在我的代码中发现了一个非常奇怪的错误,它只发生在Release版本中.对我来说它看起来像一个Swift bug,但让我知道你的想法.
import Foundation enum Level : Int { case Bad = 0,Normal = 1,Good = 2,Superb = 3 } struct Attribute : Printable { var x : Level = .Normal var y : Level = .Normal var z : Level = .Normal var w : Level = .Normal var description : String { return "((x.rawValue),(y.rawValue),(z.rawValue),(w.rawValue))" } func toString() -> String { return description } } var AccessorBugTestSingleton : AccessorBugTest! class AccessorBugTest { let index : Int var attributes : [Attribute] = [] var todaysAttributes : Attribute { get { let r = attributes[index] println("today: (r)") return r } } var initialText : String = "" // selection for key var states : [String:Int] = ["x": 0,"y": 0,"z": 0,"w": 0] var descriptions : [String:Int] = ["a": 0,"b": 0,"c": 0,"d": 0] init() { index = 10 for i in 1...31 { var att = Attribute(x: .Superb,y: .Superb,z: .Superb,w: .Superb) attributes.append(att) } let attribs = todaysAttributes initialText = "(attribs)" println("init: (attribs),(self.attributes[index])") } } 实例化AccessorBugTest时,应该打印 init: (3,3,3),(3,3) 但在Release版本中打印, init: (3,0),3) 如果我删除未使用的属性状态和描述,那么问题是固定的,不知道为什么.此外,如果我使用x,y,z,w而不是枚举,那么它再次正常工作. 知道发生了什么事吗? 我已将程序上传到:https://github.com/endavid/AccessorBugTest 我还下载了Xcode 7.1 beta,在Swift 2.0中试过,问题仍然存在:(
我觉得你发现了一个bug.一个非常有趣的bug.
我有一个解决方法:使Attribute成为一个类而不是一个结构.它仍然是一个值类,因此开销很低.您必须为它提供一个初始化程序,它执行struct memberwise初始化程序所执行的操作.当你这样做时,你会发现整个问题都消失了. 编辑:我想到了一个更好的解决方法:不要将属性设为类,而是将Level设为@objc枚举. 编辑:OP报告此错误在Swift 2.1中得到修复. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |