Cómo escribir métodos lambda en Objective-C?Cómo escribir métodos lambda en Objective-C?
Respuesta
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;
}
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.
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.
+1 para obtener una respuesta detallada. – Abizern
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
Tenga en cuenta que Blocks se puede usar en iOS 4, sin el proyecto Plausible Blocks. –
- 1. ¿Cómo escribir este cierre lambda en CoffeeScript?
- 2. Cómo escribir métodos interrumpible
- 3. Bloques ObjectiveC equivalente en Java
- 4. Cómo/cuándo escribir métodos reutilizables en OOP
- 5. Expresión Lambda versus métodos anónimos
- 6. ¿Cómo implementar un puente sin cargo en ObjectiveC/C?
- 7. Cómo crear métodos de extensión con expresiones lambda
- 8. ¿Cuándo debería escribir métodos estáticos?
- 9. diferencia entre las expresiones lambda y métodos anónimos - C#
- 10. objectivec: fb publicar comentario error
- 11. ObjectiveC Parse Integer from String
- 12. Cómo dividir la nueva línea de NSString en ObjectiveC
- 13. Cómo "dejar" en expresión lambda?
- 14. ¿Cómo implementar lambda como una función llamada "lambda" en Clojure?
- 15. LINQ vs Lambda vs Métodos anónimos vs Delegados
- 16. no puede convertir la expresión lambda para escribir 'System.Delegate'
- 17. ¿Cómo prevenir ciertas formas de entrada al escribir métodos?
- 18. lambda devuelve lambda en python
- 19. escribir un método que acepta una expresión lambda
- 20. Obtener nombre de propiedad y escribir con expresión lambda
- 21. Escribir una función que acepta una expresión lambda como argumento
- 22. ¿Cómo puedo escribir extensiones para Session sin tener que escribir métodos separados para HttpSessionState y HttpSessionStateBase?
- 23. Pros y contras del uso de excepción en IOS/ObjectiveC
- 24. Expresión lambda en C#
- 25. Cómo funciona Lambda Expresión
- 26. Lambda que devuelve otra lambda
- 27. enviar una notificación desde javascript en UIWebView a ObjectiveC
- 28. obteniendo el error "invalid_client" en la muestra gdata-objectivec-client
- 29. ¿Puedo colocar un ObjectiveC @selector en un NSDictionary?
- 30. GroupBy en expresiones lambda
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 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
+1 para proporcionar patrones de diseño que pueden ser preferibles sobre bloques en algunos situaciones – user2398029