swift swift4 key-value-observing keypaths

Enfoque de Swift 4 para observeValue(forKeyPath:…)



swift4 key-value-observing (2)

Para agregar algo a la respuesta cuando experimenté fallos en mi aplicación cuando utilizaba este método en iOS 10.

En iOS 10, aún debe eliminar el observador antes de desasignar la clase o, de lo contrario, obtendrá una NSInternalInconsistencyException que indica que:

Se desasignó una instancia A de Clase C mientras que los observadores de valor clave todavía estaban registrados con ella.

Para evitar este choque. Simplemente configura la propiedad de observador que estás utilizando en nil .

deinit { self.observation = nil }

He estado tratando de encontrar un ejemplo, pero lo que he visto no funciona en mi caso.

Cuál sería el equivalente del siguiente código:

object.addObserver(self, forKeyPath: "keyPath", options: [.new], context: nil) override public func observeValue( forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { }

El código anterior funciona, pero recibo una advertencia de SwiftLink:

Prefiera la nueva API KVO basada en bloque con rutas de acceso cuando utilice Swift 3.2 o posterior.

Aprecio si me puede indicar la dirección correcta.


Swift 4 introdujo una familia de tipos de Key-Path concretos, una nueva Expresión de Key-Path para producirlos y una nueva función de observe basada en el cierre disponible para las clases que heredan NSObject .

Usando este nuevo conjunto de características, su ejemplo particular ahora se puede expresar de manera mucho más sucinta:

self.observation = object.observe(/.keyPath) { [unowned self] object, change in self.someFunction() }

Tipos involucrados

Gramática del camino clave

La grammar general de una expresión de Key-Path sigue la forma /Type.keyPath donde Type es un nombre de tipo concreto (incluido cualquier parámetro genérico), y keyPath una cadena de una o más propiedades, subíndices, o postfijos opcionales de encadenamiento / desenvolvimiento forzado . Además, si el Tipo de keyPath se puede inferir del contexto, se puede eliminar, lo que resulta en un /.keyPath muy conciso.

Estas son todas las expresiones de ruta de acceso válidas:

/SomeStruct.someValue /.someClassProperty /.someInstance.someInnerProperty /[Int].[1] /[String].first?.count /[SomeHashable: [Int]].["aStringLiteral, literally"]!.count.bitWidth

Propiedad

Usted es el propietario de la instancia NSKeyValueObservation devuelve la función de observe , lo que significa que ya no tiene que addObserver ni el removeObserver ni removeObserver ; más bien, mantienes una fuerte referencia a él durante el tiempo que necesites que tu observación sea observada.

Tampoco está obligado a invalidate() : se deinit gracia. Por lo tanto, puede dejarlo vivo hasta que la instancia que lo contiene muera, detenerlo manualmente nil la referencia o incluso invocar invalidate() si necesita mantener su instancia con vida por algún motivo maloliente.

Advertencias

Como habrás notado, la observación todavía se esconde dentro de los confines del mecanismo KVO de Cocoa, por lo tanto, solo está disponible para las clases de Obj-C y Swift que heredan NSObject (el tipo favorito de cada Swift-dev) con el requisito adicional de que cualquier valor que quieras observar. , debe marcarse como @objc (el atributo favorito de cada Swift-dev) y declararse dynamic .

Dicho esto, el mecanismo general es una mejora bienvenida, particularmente porque logra Swiftify observando los NSObjects importados de los módulos que podemos usar (por ejemplo, Foundation ), y sin el riesgo de debilitar el poder expresivo que trabajamos tan arduamente para obtener. con cada pulsación de tecla.

Como nota al margen, las expresiones de cadena de ruta de acceso NSObject aún son necesarias para acceder dinámicamente a las propiedades de NSObject a KVC o al value(forKey(Path):) llamada value(forKey(Path):)

Más allá de KVO

Hay mucho más para Key-Path Expressions que KVO. /Type.path expresiones /Type.path se pueden almacenar como objetos KeyPath para reutilizarlos posteriormente. Vienen en sabores escribibles, parciales y borrados de tipo. Pueden aumentar el poder expresivo de las funciones de captador / definidor diseñadas para la composición, sin mencionar el papel que desempeñan al permitir que aquellos con los estómagos más potentes se adentren en el mundo de los conceptos funcionales como lentes y prismas. Le sugiero que revise los enlaces a continuación para obtener más información sobre las muchas puertas de desarrollo que pueden abrir.

Campo de golf:

Expresión del camino clave @ docs.swift.org

KVO docs @ Apple

Propuesta de Swift Evolution Smart KeyPaths

El patio de juegos Whats-new-in-Swift-4 de Ole Begemann con ejemplos de Key-Path

Video de la WWDC 2017: Novedades en Foundation 4:35 para SKP y 19:40 para KVO.