Accessor da el valor incorrecto solo en la versión de lanzamiento de Swift 1.2 / 2.0
Encontré un error muy extraño en mi código que solo ocurre en las versiones de lanzamiento. A mí me parece un error de Swift, pero déjame saber lo que piensas.
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])")
}
}
Cuando se crea una instancia de AccessorBugTest, se debe imprimir
init: (3, 3, 3, 3), (3, 3, 3, 3)
pero en las versiones de lanzamiento se imprime,
init: (3, 0, 0, 0), (3, 3, 3, 3)
Si elimino las propiedades no utilizadasstates
ydescriptions
, entonces el problema está solucionado, no tengo idea de por qué. Además, si hagox
, y
, z
, w
Ints en lugar de enumeraciones, entonces funciona correctamente de nuevo.
¿Alguna idea de lo que está pasando?
He subido el programa a:https://github.com/endavid/AccessorBugTest Contiene un caso de prueba que fallará si lo ejecuta en la configuración de lanzamiento (vaya a Programa -> Esquema -> Editar esquema y cambie Prueba a lanzamiento en lugar de Depurar).
También descargué Xcode 7.1 beta, probé en Swift 2.0, y el problema aún existe :(