Swift 4 “Esta clase no cumple con la encoding de valores clave”

Tengo una biblioteca Swift que depende en gran medida de obj.valueForKey() de NSObject .

Después de migrar a Swift 4, descubrí que estas llamadas siempre se bloquean con el error “esta clase no es un valor clave que cumpla con la encoding de la clave …” a menos que la propiedad que estoy buscando se declare con @objc .

¿Ahora es obligatorio declarar propiedades con @objc para que se puedan encontrar con este método? ¿Hay una alternativa?

Cuando realizó la migración, Xcode preguntó acerca de la inferencia de @objc y probablemente seleccionó el nuevo tipo en lugar de Swift3.

Soluciones posibles:

Use @objc

Use @objc en cada método, según sea necesario en lugar de toda la clase.

Use @objcMembers

Podrías simplemente usar @objcMembers en la clase.

Al aplicar el atributo @objcMembers a una clase, se agrega implícitamente el atributo @objc a todos sus miembros compatibles con Objective-C.

Escribir clases rápidas y protocolos con comportamiento Objective-C

Tenga en cuenta que, dado que la aplicación del atributo @objc puede boost el tamaño comstackdo de una aplicación y afectar negativamente al rendimiento, solo aplique el atributo @objcMembers en las declaraciones cuando cada miembro necesite aplicar el atributo @objc .

Cambiar la inferencia al viejo comportamiento

También puede cambiar el comportamiento del proyecto en: Build Settings > Swift 3 @objc Inference > On / Off

Preguntas relacionadas:

  • ¿El uso de la inferencia de Swift 3 @objc en el modo Swift 4 está en desuso?
  • ¿Cómo puedo lidiar con la deposición de inferencia de @objc con #selector () en Swift 4?