29 votos

Propiedad de bloque de Objective-C con Xcode finalización de código

Es posible definir un Objetivo-C bloque de la propiedad, pero todavía tienen la completa finalización de código en Xcode 4?

Si yo uso un typedef para definir el bloque:

typedef void (^CompletionBlock)(MyObject *myObj);

y, a continuación, defina la propiedad:

@property (nonatomic, copy) CompletionBlock completionBlock;

y, a continuación, @synthesize la propiedad no entiendo completa finalización de código cuando se llama a la incubadora. Xcode utilizará el typedef y debido a esto, a la finalización de código no utiliza el bloque completo de la sintaxis completa con el bloque de parámetros, se utiliza el typedef.

Si he de definir un método de prototipo en el encabezado que se utiliza el bloque completo de la sintaxis en lugar de la typedef:

@property (nonatomic, copy) void (^completionBlock)(MyObject *myObj);

y entonces yo uso @synthesize, el setter se compara a usar el código completo de la finalización de la sintaxis pero, fundamentalmente, se deja fuera los nombres de los parámetros:

[self setCompletionBlock:(void (^)(MyObject *)) { ... }

Por último, si yo intente @synthesize y, a continuación, reemplace el setter de la aplicación o poner el prototipo en el encabezado:

- (void)setCompletionBlock:(void (^)(MyObject *myObj))completionBlock {...}

Una advertencia es elevado indica que el tipo de propiedad no coincide con el tipo de descriptor de acceso. No importa cómo intento de conseguir la sintaxis, no soy capaz de definir un bloque de propiedad y un setter que tiene la sintaxis completa para completar el código. ¿Puedo tener mi pastel y comérselo también?

Gracias!

34voto

Matt Puntos 1068

Definitivamente, usted puede tener su pastel y comérselo también, si usted está dispuesto a agregar una línea de código a la clase de la interfaz.

En primer lugar, definir bloque con un typedef y crear una propiedad como lo hizo en su pregunta:

typedef void (^CompletionBlock)(MyObject *myObj);

...

@property (nonatomic, copy) CompletionBlock completionBlock;

A continuación, como MobileOverload señaló en su respuesta, sabemos que Xcode ofrece correcta finalización de código para typedef d bloques si se utiliza en un método independiente de la declaración. Por lo tanto, vamos a añadir una declaración explícita de la incubadora de completionBlock:

- (void)setCompletionBlock:(CompletionBlock)completionBlock;

Cuando se llama a este método resuelve el método setter declarado por la propiedad. Sin embargo, debido a que hemos definido explícitamente en la interfaz de clase, Xcode ve y se aplica la completa finalización de código.

Así, si se incluyen todas las tres de estas líneas se debe obtener el resultado deseado. Este comportamiento es claramente un defecto de Xcode, ya que no hay ninguna razón por la que un organismo se define en un @property declaración debería haber diferentes finalización de código que el mismo método definido por su propia cuenta.

4voto

MobileOverlord Puntos 2615

Usted puede conseguir un poco de fantasía en busca de la finalización de código al pasar los bloques como argumento a un método en su clase. En el archivo de cabecera me typedef d el bloque como este

typedef void (^MyCompletionBlock)(id obj1, id obj2);

Entonces yo era capaz de utilizar como un argumento a mi método con el que también han declarado que en esta clase de encabezado.

-(void)doThisWithBlock:(MyCompletionBlock)block;

En el m archivo que he declarado el método

-(void)doThisWithBlock:(MyCompletionBlock)block {
    NSLog(@"Something");
}

y cuando fui a la llamada que recibí de lujo de la finalización de código como este. CodeCompletion1

CodeCompletion2

Espero que esto responda tu pregunta.

1voto

alex gray Puntos 5089

Ok, así que se me ocurrió una provisional manera de hacer esto que no resultan en advertencias / errores... y en realidad hace que las cosas sean más fáciles de leer más corto, etc.

definir una macro con nuestro "abreviatura" y, a continuación, utilizar el formato completo en la propiedad de la declaración como...

#define TINP NSString*(^)(NSString *typed, const char *raw)
@interface ....
@property (copy) NSString*(^termDidReadString)(NSString *typed, const char *raw);

posteriormente.. usted puede, a continuación, hacer referencia a ese "tipo" de argumento, etc como..

+ (void)addInputBlock:(TINP)termDidReadString;

y voilá... no sólo su código sea MÁS pequeño!! pero finalización de código de trabajo, como un encanto...

enter image description here

0voto

Apps 4 U Puntos 101

No sé acerca de sugerencias de código completo, pero puede utilizar fragmentos de código para conseguir la finalización de código como comportamiento y puede utilizar los titulares de lugar en los fragmentos de código < #PLACE titular # >. Espero que esto te ayudará

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X