swift - ¿Usando setValue(value, forKey: key) en Int? tipos incendios no conformes al método de codificación de valor de clave
nsnumber key-value-coding (2)
KVO no puede funcionar con opciones Swift puras porque las opciones Swift puras no son objetos Objective-C. Swift prohíbe el uso de dynamic
o @objc
con clases y estructuras genéricas porque no hay un equivalente válido de Objective-C, por lo que el tiempo de ejecución no está configurado para admitir KVO en instancias de ese tipo de objetos. En cuanto a por qué funciona con String?
, ese tipo es un puente gratuito a NSString
, por lo que es semánticamente equivalente a NSString *
, un tipo Objective-C que el tiempo de ejecución sabe muy bien cómo tratar. ¿Pero compararlo con Int?
cuyo equivalente semántico sería Optional<Int>
, no UnsafePointer<Int>
o NSNumber *
como podría esperarse. Por ahora, deberá convencer al buscador de tipos de que es seguro representarlo en Objective-C utilizando NSNumber!
.
Esto es completamente al revés y, en mi opinión, una desafortunada limitación del sistema de tipos. Para cualquier ingeniero que se encuentre en esta publicación, vea rdar: // 18624182.
Estoy utilizando con éxito el método setValue(value, forKey: key)
en mi subclase Swift NSObject compatible con NSKeyValueCoding.
Esto funciona perfectamente bien en opciones de cadena, por ejemplo
var name:String?
Sin embargo, en las opcionales de Int, falla, lo que desencadena el método de clave no definida que he reemplazado para propósitos de depuración:
override func setValue(value: AnyObject!, forUndefinedKey key: String!) {
println("/(self) this class is not key value coding-compliant for the key /(key)")
}
Entonces, por ejemplo, una clave de myId
con un buen valor entero dispararía el método de clave no definido arriba.
var myId:Int?
Si cambio la definición anterior para que no sea opcional, entonces todo funciona bien:
var myId:Int = 0
Con myId
como opcional, he intentado absolutamente todo lo que puedo pensar en la forma de lanzar, desenvolver, inicializar, etc. Simplemente no ve a la clase como un valor clave compatible con esos valores numéricos.
Sé que es un buen valor numérico. ¿Cambiando la declaración var a String? choques También se ve bien en lldb:
Printing description of key:
myId
key NSObject 0x00007fb8d530ca20 0x00007fb8d530ca20
k NSString "myId" 0x00007fa2aa942f20
value __NSCFNumber * Int64(4348129) 0xb000000004258e13
Printing description of value:
4348129
(lldb)
Entonces, la pregunta es, ¿alguien ha usado - en Swift - el método setValue(value, forKey: key)
en un tipo Int con éxito?
Si estás dispuesto a deshacer los cambios de Swift:
var myId:Int?
a:
var myId:NSNumber?