2009-06-03 9 views

Antwort

27

OS X 10.6 eingeführt Blöcke. Siehe AlBlue's answer for examples.

Wenn Sie Snow Leopard nicht verwenden, können Sie mit verschiedenen anderen Funktionen etwas zum Zusammensetzen der Funktionen erhalten.

Beispiel unter Verwendung von C Funktionszeiger:

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

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

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

Beispiel mit dem Befehl Muster:

@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; 
} 

Beispiel mit einem Selektor:

@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

Möglicherweise war das früher der Fall, aber die Sprache verfügt jetzt über Blöcke, mit denen Sie echte Lambda-Ausdrücke definieren können. Allerdings ist es ein wirklich nützlicher Mechanismus im Objective-C Toolkit, @selector() wie oben beschrieben weitergeben zu können. – AlBlue

+1

-1 für fehlende Informationen über Blöcke, eine zentrale neue Funktion, verfügbar in C, ObjC und C++, wenn Apples GCC in der neuen 10.6 Version von OS X. – harms

+0

+1 für die Bereitstellung von Entwurfsmuster, die in einigen möglicherweise besser als Blöcke sind Situationen. – user2398029

3

Ich hörte André Pang bei NSConference reden wie Blöcke mit der nächsten Version von Objective-C eingeführt werden.

Dies sollte eine funktionale Programmierung ermöglichen.

Bearbeiten: Seit Snow Leopard veröffentlicht wurde, ist dies in der Tat der Fall. Objective-C hat jetzt Blocks.

87

Das Konzept eines Lambda in Objective-C ist jetzt mit der Idee von Blocks gekapselt, die den Pass-by-Reference-Funktionen entsprechen. Natürlich hatte man das schon in C mit der Idee von Funktionszeigern; Blöcke sind nur eine Möglichkeit, auch den lokalen Zustand zu erfassen (d. h. können Verschlüsse sein). Tatsächlich können Blöcke auch in anderen C-Sprachen (auf Mac) verwendet werden - es gibt einen Vorschlag, sie Teil der Standard-C-Syntax zu machen.

Hier ist ein Beispiel eine Lambda der Definition von zwei Zahlen zu multiplizieren zusammen:

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

Der erste Teil eine Variable deklariert, vom Typ ^int(int,int) und dann weist sie den Lambda-Ausdruck (aka-Block), die die Mehrfach kehrt seiner zwei Argumente. Sie können dann das Fn herumreichen, es an anderen Orten definieren usw .; Sie können es sogar in anderen Funktionen verwenden.

Hier ist ein Beispiel, eine Funktion zu definieren, die, wenn sie aufgerufen wird, gibt eine andere Funktion:

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

Beachten Sie, dass Blöcke mit Objekttypen miteinander vermischen können und viele der neuen (in der Regel id als Objekttyp verwendet wird) Objective-C-Objektdatenstrukturen haben irgendeine Art von Operation auf Blockebene. GCD verwendet auch Blöcke, um beliebige Ereignisse zu übergeben; Beachten Sie jedoch, dass GCD auch mit Funktionszeigern verwendet werden kann.

+0

+1 für eine detaillierte Antwort. – Abizern

+0

Beachten Sie auch, dass die Blockunterstützung mit dem Projekt Plausible Blocks auf 10.5 und das iPhone OS portiert wurde. http://code.google.com/p/plblocks/ – Chuck

+1

Beachten Sie, dass Blöcke in iOS 4 ohne das Projekt Plausible Blocks verwendet werden können. –