Accessor дает неверное значение только в Swift 1.2 / 2.0 Release build
Я обнаружил очень странную ошибку в моем коде, которая возникает только в сборках Release. Это похоже на ошибку Свифта, но дайте мне знать, что вы думаете.
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, 3, 3, 3)
но в сборках Release он печатает,
init: (3, 0, 0, 0), (3, 3, 3, 3)
Если я удалю неиспользуемые свойстваstates
а такжеdescriptions
, то проблема решена, понятия не имею, почему. Кроме того, если я сделаюx
, y
, z
, w
Ints вместо enums, затем снова работает нормально.
Есть идеи о том, что происходит?
Я загрузил программу в:https://github.com/endavid/AccessorBugTest Он содержит контрольный пример, который не будет выполнен, если вы запустите его в конфигурации выпуска (перейдите в «Программа» -> «Схема -> Изменить схему» и измените «Тест на выпуск» вместо «Отладка»).
Я также скачал бета-версию Xcode 7.1, пробовал в Swift 2.0, и проблема все еще существует :(