2009-06-03 12 views

Respuesta

27

OS X 10.6 introdujo bloques. Ver AlBlue's answer for examples.

Si no está utilizando Snow Leopard, puede obtener algo parecido a la composición de la función mediante otras funciones.

ejemplo usando C punteros de función:

void sayHello() { 
    NSLog(@"Hello!"); 
} 

void doSomethingTwice(void (*something)(void)) { 
    something(); 
    something(); 
} 

int main(void) { 
    doSomethingTwice(sayHello); 
    return 0; 
} 

Ejemplo utilizando el patrón de comando:

@protocol Command <NSObject> 
- (void) doSomething; 
@end 

@interface SayHello : NSObject <Command> { 
} 
@end 

@implementation SayHello 
- (void) doSomething { 
    NSLog(@"Hello!");  
} 
@end 

void doSomethingTwice(id<Command> command) { 
    [command doSomething]; 
    [command doSomething]; 
} 

int main(void) { 
    SayHello* sayHello = [[SayHello alloc] init]; 
    doSomethingTwice(sayHello); 
    [sayHello release]; 
    return 0; 
} 

Ejemplo usando un selector:

@interface SaySomething : NSObject { 
} 
- (void) sayHello; 
@end 

@implementation SaySomething 
- (void) sayHello { 
    NSLog(@"Hello!");  
} 
@end 

void doSomethingTwice(id<NSObject> obj, SEL selector) { 
    [obj performSelector:selector]; 
    [obj performSelector:selector]; 
} 

int main(void) { 
    SaySomething* saySomething = [[SaySomething alloc] init]; 
    doSomethingTwice(saySomething, @selector(sayHello)); 
    [saySomething release]; 
    return 0; 
} 
+1

Esto puede haber sido cierto anteriormente, pero el lenguaje ahora tiene Bloques, que le permiten definir expresiones lambda reales. Habiendo dicho eso, ser capaz de pasar @selector() s como se describe arriba es un mecanismo realmente útil en el juego de herramientas Objective-C. – AlBlue

+1

-1 para información faltante sobre bloques, una característica central nueva, disponible en C, ObjC y C++, cuando se usa GCC de Apple en la nueva versión 10.6 de OS X. – harms

+0

+1 para proporcionar patrones de diseño que pueden ser preferibles sobre bloques en algunos situaciones – user2398029

3

oí André Pang en NSConference hablando cómo se iban a introducir los bloques con la próxima versión de Objective-C.

Esto debería permitir la programación funcional.

Editar: Desde que se lanzó Snow Leopard, este es realmente el caso. Objective-C ahora tiene Blocks.

87

El concepto de lambda en Objective-C ahora está encapsulado con la idea de Blocks que es el equivalente de las funciones de paso por referencia. Por supuesto, podría decirse que uno ya tenía en C la idea de indicadores de función; los bloques son solo una forma de capturar también el estado local (es decir, pueden ser cierres). De hecho, los bloques también se pueden usar en otros lenguajes C también (en Mac): hay una propuesta para hacerlos parte de la sintaxis C estándar.

Aquí está un ejemplo de definición de una lambda para multiplicar dos números:

int (^mult)(int, int) = ^(int a, int b) { return a*b; }; 

La primera parte declara una variable, de tipo ^int(int,int) y luego lo asigna a la expresión lambda (también conocido como bloque) que devuelve el múltiplo de sus dos argumentos Luego puede pasar ese fn, definirlo en otros lugares, etc. incluso puedes usarlo en otras funciones.

He aquí un ejemplo de definición de una función, que cuando se invoca, devuelve otra función:

multiplyBy = ^(int a) { return ^(int b) { return b*a; }; }; 
triple = multiplyBy(3); 

Tenga en cuenta que se puede entremezclar bloques con los tipos de objetos (por lo general utilizando id como el tipo de objeto) y muchos de los nuevos Las estructuras de datos de objeto Objective-C tienen algún tipo de operación a nivel de bloque. GCD también usa bloques para pasar eventos arbitrarios; sin embargo, tenga en cuenta que GCD también puede usarse con punteros a funciones.

+0

+1 para obtener una respuesta detallada. – Abizern

+0

Tenga en cuenta también que el soporte de bloque ha sido portado a 10.5 y el iPhone OS con el proyecto de Bloques plausibles. http://code.google.com/p/plblocks/ – Chuck

+1

Tenga en cuenta que Blocks se puede usar en iOS 4, sin el proyecto Plausible Blocks. –

Cuestiones relacionadas