Come scrivere i metodi lambda in Objective-C?Come scrivere i metodi lambda in Objective-C?
risposta
OS X 10.6 ha introdotto blocchi. Vedi AlBlue's answer for examples.
Se non si utilizza Snow Leopard, è possibile ottenere qualcosa vicino alla composizione delle funzioni utilizzando varie altre funzionalità.
esempio con C puntatori a funzione:
void sayHello() {
NSLog(@"Hello!");
}
void doSomethingTwice(void (*something)(void)) {
something();
something();
}
int main(void) {
doSomethingTwice(sayHello);
return 0;
}
esempio usando il modello di 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;
}
Esempio con un selettore:
@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;
}
ho sentito André Pang a NSConference parlando come sarebbero stati introdotti i blocchi con la prossima versione di Objective-C.
Ciò dovrebbe consentire la programmazione funzionale.
Modifica: poiché Snow Leopard è stato rilasciato, questo è davvero il caso. Objective-C ora ha Blocks.
Il concetto di lambda in Objective-C è ora incapsulato con l'idea di Blocks che sono l'equivalente delle funzioni pass-by-reference. Certo, probabilmente uno lo aveva già in C con l'idea dei puntatori di funzione; i blocchi sono solo un modo per catturare anche lo stato locale (ad esempio possono essere chiusure). In effetti, i blocchi possono essere utilizzati anche in altri linguaggi C (su Mac) - c'è una proposta per renderli parte della sintassi C standard.
Ecco un esempio di definizione un lambda per moltiplicare due numeri insieme:
int (^mult)(int, int) = ^(int a, int b) { return a*b; };
La prima parte dichiara una variabile, di tipo ^int(int,int)
e quindi assegna alla espressione lambda (alias blocco) che restituisce il multiplo dei suoi due argomenti. È quindi possibile passare quel fn in giro, definirlo in altri posti ecc; puoi persino usarlo in altre funzioni.
Ecco un esempio di definizione di una funzione, che una volta invocata, restituisce un'altra funzione:
multiplyBy = ^(int a) { return ^(int b) { return b*a; }; };
triple = multiplyBy(3);
noti che è possibile intermix blocchi con i tipi di oggetto (di solito utilizzando id
come tipo di oggetto) e molti dei nuovi Le strutture di dati oggetto Objective-C hanno una sorta di operazione a livello di blocco. GCD usa anche blocchi per passare eventi arbitrari; tuttavia, si noti che GCD può essere utilizzato anche con i puntatori di funzione.
+1 per una risposta dettagliata. – Abizern
Nota anche che il supporto per i blocchi è stato portato su 10.5 e il SO per iPhone con il progetto Plausible Blocks. http://code.google.com/p/plblocks/ – Chuck
Nota che i blocchi possono essere utilizzati in iOS 4, senza il progetto Plausible Blocks. –
- 1. Come scrivere metodi interrompibili
- 2. ObjectiveC blocca l'equivalente Java
- 3. Come scrivere un'espressione Lambda VB.Net
- 4. Come scrivere questa chiusura lambda in CoffeeScript?
- 5. Come scrivere i metodi init di un UIViewController in Swift
- 6. Uso delle funzioni lambda C++ 11 in ARC ObjectiveC++ - come farlo correttamente?
- 7. Come dividere newline da NSString in ObjectiveC
- 8. Come/quando scrivere metodi riutilizzabili in OOP
- 9. Implementare protocollo ObjectiveC in rapida
- 10. Simula metodi C# Lambda in Javascript
- 11. Come scrivere correttamente Parallel.Per metodi asincroni
- 12. Come implementare il bridging senza pedaggio in ObjectiveC/C?
- 13. Metodi anonimi rispetto all'espressione lambda
- 14. Scrivere metodi jquery static util
- 15. È possibile scrivere i metodi di estensione per Console?
- 16. Perché i lambda sono convertibili in espressioni ma i gruppi di metodi no?
- 17. Come mappare i parametri lambda in TakeWhile?
- 18. Come omettere i parametri lambda in Kotlin?
- 19. Come utilizzare i metodi java?
- 20. Come creare metodi di estensione con espressioni lambda
- 21. Scrivere una funzione che accetta un'espressione lambda come argomento
- 22. Differenza tra le espressioni lambda e metodi anonimi - C#
- 23. Come passare i metodi migliori in metodi della stessa classe
- 24. Come chiamare i metodi factory da HTML in angularjs? metodi
- 25. Metodi per scrivere file Parquet usando Python?
- 26. lambda con metodi non statici in Java 8
- 27. Come aggiungere i miei metodi all'oggetto HTMLElement?
- 28. Come scrivere un lambda variadico generico che scarta i suoi parametri?
- 29. Come scrivere i dati denormalizzati in Firebase
- 30. I metodi richiamano in ordine casuale (C#)
Questo potrebbe essere vero prima, ma ora il linguaggio ha Blocchi, che consentono di definire vere espressioni lambda. Detto questo, essere in grado di passare intorno a @selector() s come descritto sopra è un meccanismo davvero utile nel toolkit Objective-C. – AlBlue
-1 per informazioni mancanti sui blocchi, una nuova funzionalità centrale, disponibile in C, ObjC e C++, quando si utilizza GCC di Apple nella nuova versione 10.6 di OS X. – harms
+1 per fornire modelli di progettazione che potrebbero essere preferibili su blocchi in alcuni situazioni. – user2398029