swift nsnumber key-value-coding nskeyvaluecoding

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?