2009-06-03 5 views

risposta

27

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; 
} 
+1

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

-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

+0

+1 per fornire modelli di progettazione che potrebbero essere preferibili su blocchi in alcuni situazioni. – user2398029

3

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.

87

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.

+0

+1 per una risposta dettagliata. – Abizern

+0

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

+1

Nota che i blocchi possono essere utilizzati in iOS 4, senza il progetto Plausible Blocks. –