type the raw not must literal have for enum does cannot objective-c

the - ¿Qué es Key-Value-Coding y Key-Value-Observing en Objective C?



swift 4 enum string (4)

Key Value Coding es simplemente acceder a una propiedad de un objeto a través de una cadena en lugar de la sintaxis literal.

// Here is a new instance of an object Foo *foo = [[Foo alloc] init]; // Accessing a property called someValue with literal syntax: [foo someValue]; // Accessing the same property with dot notation foo.someValue; // Accessing the same property with Key-Value coding: [foo valueForKey:@"someValue"];

El poder de KVC es que puedes especificar cualquier cadena arbitraria en el tiempo de ejecución (obviamente esto también podría ser muy peligroso).

¿Alguien puede explicar en términos simples qué es Key-Value-Coding y Key-Value-Observing ? No proporcione enlaces al documento de referencia del desarrollador de Apple. He pasado por ellos. Espero una explicación en términos muy simples.


Key-Value-Coding (KVC) significa acceder a una propiedad o valor utilizando una cadena.

id someValue = [myObject valueForKeyPath:@"foo.bar.baz"];

Que podría ser lo mismo que:

id someValue = [[[myObject foo] bar] baz];

Key-Value-Observing (KVO) le permite observar cambios en una propiedad o valor.

Para observar una propiedad usando KVO, identificaría a la propiedad con una cadena; es decir, usando KVC. Por lo tanto, el objeto observable debe ser compatible con KVC.

[myObject addObserver:self forKeyPath:@"foo.bar.baz" options:0 context:NULL];


La codificación de valores clave le permite buscar o cambiar una propiedad de un objeto utilizando una cadena, en tiempo de ejecución, en lugar de tener que escribir el código compilado en una propiedad fija desde el inicio:

NSNumber* foo = [myPopup valueForKey: @"selectedItemIndex"]; [myPopup setValue: @15 forKey: @"selectedItemIndex"];

Un buen ejemplo de esto es NSTableView en Mac, donde puede establecer un identificador en cada columna de la tabla que corresponde a la propiedad de su objeto modelo que debe mostrarse, y luego su fuente de datos solo llama a -valueForKey: / - setValue: forKey: con el identificador de la columna como la clave y los valores se muestran / configuran más o menos. Simplemente agrega las columnas correctas a la vista de tabla en XIB.

La observación del valor clave se agregó después y le permite registrarse para recibir notificaciones sobre los cambios realizados en otro objeto. Usted registra su interés haciendo:

void* gMyKVOContext = &gMyKVOContext; // global variable somewhere that guarantees us a unique address that doesn''t collide with a subclass''s registration for observing the same property ... [interestingObject addObserver: interestedObject forKeyPath: @"interestingProperty" options: 0 context: gMyKVOContext];

Siempre que se cambie esa propiedad, -observeValueForKeyPath: ofObject: change: context: se invocará sobre el objeto que especificó como el observador. Entonces implementarías eso como:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if( context == gMyKVOContext && [keyPath isEqualToString: @"interestingProperty"] ) { // Update UI that shows interestingProperty } else [super observeValueForKeyPath: keyPath ofObject: object change: change context: context]; }

La ventaja aquí es que te llaman en vivo en el momento en que cambias otra propiedad. Tenga en cuenta que los objetos tienen que trabajar un poco para que se envíen estas notificaciones, de modo que no todas las propiedades son de valor-clave observable. También tenga en cuenta que algunos objetos pueden estar en un estado inválido si dos propiedades relacionadas se cambian inmediatamente después de la otra: se le notifica después de que se ha cambiado la primera propiedad, que ahora contradice la segunda, y solo entonces la segunda propiedad se cambia y usted '' re notificada por eso. Entonces, durante la primera devolución de llamada del observador, el objeto puede estar en un estado extraño, así que tenga cuidado de cómo reacciona a eso.

Para hacer que una propiedad sea observable, utilice la implementación predeterminada @synthesized cuando la defina, o si la define usted mismo, implemente el setter como:

-(void) setFoo: (int)inFoo { [self willChangeValueForKey: @"foo"]; _foo = inFoo; [self didChangeValueForKey: @"foo"]; }

Luego, siempre vaya a través del ajustador para cambiarlo, no cambie _foo directamente. Si tiene propiedades relacionadas que podrían contradecirse entre sí como la anterior, una buena forma de evitar esto es cambiarlas siempre en pares (aunque no puede usar KVC). Para hacer eso, implementa un setter combinado como:

-(void) setFoo: (int)inFoo bar: (int)inBar { [self willChangeValueForKey: @"foo"]; [self willChangeValueForKey: @"bar"]; _foo = inFoo; _bar = inBar; [self didChangeValueForKey: @"bar"]; [self didChangeValueForKey: @"foo"]; }

De esta forma, ambas notificaciones se envían mientras las propiedades están en los estados correctos.


Empieza aqui.

La codificación de clave-valor es un mecanismo para acceder a las propiedades de un objeto indirectamente, utilizando cadenas para identificar propiedades, en lugar de invocar un método de acceso o acceder a ellos directamente a través de variables de instancia.