¿Qué es KVC?

Durante el proceso de desarrollo de iOS, a menudo escuchamos o usamos KVO/KVC, pero es posible que no sepamos mucho sobre qué son KVO y KVC. Primero comprendamos qué es KVC.

¿Qué es KVC?

En la documentación oficial de Apple, KVC se describe como un mecanismo para acceder indirectamente a las propiedades de los objetos a través de descriptores de cadenas, en lugar de llamar a métodos de acceso o utilizar variables de instancia directamente. Hablando francamente, KVO es un mecanismo para acceder a variables o propiedades miembro a través de métodos no convencionales. Esta forma poco convencional consiste en acceder a una propiedad o variable miembro a través de un identificador de cadena (la llamada clave). Esta clave suele ser un nombre de propiedad o un nombre de variable de instancia.

Los métodos básicos de KVC se definen en el protocolo informal de NSKeyValueCoding, que NSObject implementa de forma predeterminada.

KVC no solo admite tipos de objetos, sino también tipos y estructuras numéricos. Los parámetros y tipos de retorno de tipos que no son de objeto se encapsulan automáticamente en tipos NSValue o NSNumber.

KVO se puede utilizar para acceder a tres tipos diferentes de valores de objetos: atributos, relaciones uno a uno y relaciones uno a muchos.

Los atributos pueden ser valores simples, como valores numéricos, cadenas, tipos bool, etc. También puede ser un valor de objeto como NSNumber o NSColor.

Los objetos en una relación uno a uno pueden tener sus propias propiedades, que se pueden cambiar sin cambiar el objeto. Al igual que las propiedades de superView de UIView, podemos cambiar las propiedades de superView sin cambiar UIView.

Las propiedades uno a muchos son colecciones de objetos relacionados. Estas colecciones generalmente las almacena NSArray o NSSet. KVO también permite a los usuarios personalizar las clases de colección pero aún así acceder a ellas como NSArray o NSSet.

Claves y rutas de claves

Las palabras clave son cadenas utilizadas para identificar propiedades de objetos. Normalmente, la clave es el nombre de un método de acceso o una variable de instancia del objeto. La clave debe estar codificada en ASCII, comenzar con una letra minúscula y no puede contener espacios. Dé algunos ejemplos de palabras clave: edad, nombre, apellido, etc.

Una ruta de puntos clave es una secuencia de puntos clave separados por puntos, que se utiliza para recorrer una serie de propiedades de un objeto. El atributo de la primera clave está relacionado con el receptor y cada subsecuencia está relacionada con el atributo anterior. Por ejemplo, la ruta crítica dirección.calle, que primero obtendrá el atributo de dirección del receptor y luego obtendrá el atributo de calle del atributo de dirección.

Utilice KVC para obtener el valor del atributo

Método valueForKey: Devuelve el valor de la clave asociada al receptor. Si la clave especificada no tiene un descriptor de acceso o una variable de instancia, envíese a sí mismo el mensaje valueForUndefinedKey:. La implementación predeterminada de este método arroja NSUndefinedKeyException. Las subclases pueden anular este método.

De manera similar, valueForKeyPath: devuelve el valor de la ruta clave asociada con el receptor. Para cualquier objeto de la subfamilia que no siga KVC, recibirá un mensaje valueForUndefineKey:.

DictionaryWithValuesForKeys: Recupera los valores de todas las claves del array relacionado con el receptor. El NSDictionary devuelto contiene los valores de todas las claves de la matriz.

Nota: nil no se puede utilizar como valor en objetos de colección, como NSArray, NSSet y NSDictionary. En su lugar, deberías reemplazar nil con un objeto NSNull. NSNull es una propiedad de objeto que representa nulo. De forma predeterminada, en la implementación de los métodos DictionaryWithValuesForKeys: y setValuesForKeysWithDictionary:, se realiza la conversión entre nil y NSNull.

No es necesario probar explícitamente nil en su objeto.

Utilice KVC para establecer el valor del atributo.

Método setValue: forKey: establece el valor de la clave relevante en el receptor al valor especificado. En la implementación de este método, el valor de NSValue se convertirá en un valor numérico genérico y luego se asignará al atributo.

Si la clave especificada no existe, se enviará un mensaje setValue:forUndefinedKey: al destinatario. La implementación predeterminada de este método genera una excepción clave inesperada; las subclases pueden anular este método para definir el comportamiento predeterminado.

La implementación del método setValue:forKeyPath: es la misma que el método anterior, excepto que se utiliza para manejar rutas clave.

SetValuesForKeysWithDictionary: El método asigna las propiedades relevantes al receptor utilizando los valores del diccionario especificado. La implementación predeterminada de este método llama al método setValue:forKey: una vez para cada par clave-valor y convierte automáticamente nil a NSNull.

Finalmente, debes considerar qué hacer al intentar asignar un valor nulo a un tipo que no es de objeto. En este caso, el receptor enviará el mensaje setNilValueForKey: y la implementación predeterminada de este método es lanzar NSInvalidArgumentException. En su aplicación, puede anular este método para definir un valor predeterminado y luego activar setValue:forKey con el nuevo valor.