Wie schreibt man Lambda-Methoden in Objective-C?Wie schreibt man Lambda-Methoden in Objective-C?
Antwort
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;
}
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.
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.
+1 für eine detaillierte Antwort. – Abizern
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
Beachten Sie, dass Blöcke in iOS 4 ohne das Projekt Plausible Blocks verwendet werden können. –
- 1. AMF0 Parser in ObjectiveC
- 2. Wie schreibt man mehrere Anweisungen?
- 3. , wie man schreibt Mysql Abfrage
- 4. Wie schreibt man es schön?
- 5. Wie schreibt man faule Accessoren
- 6. Wie schreibt man Ajax richtig?
- 7. Wie schreibt man eine Parallelschleife in Julia?
- 8. wie man soapclient funktion in php schreibt?
- 9. Wie schreibt man benutzerdefinierte Ausnahmen in C#?
- 10. Wie man Helper-Klasse in Typoskript schreibt?
- 11. Wie man DataRow in C# fett schreibt?
- 12. Wie schreibt man eine Klasse in Javascript?
- 13. , wie man schreibt Abfrage in Hibernate beitreten
- 14. Wie schreibt man das in Fortran?
- 15. OCaml Wie schreibt man in eine Datei?
- 16. Ruby, wie man in Tempfile schreibt
- 17. Wie schreibt man nacheinander Zeichen in TelnetOutputStream?
- 18. ObjectiveC - wie NSUserNotification Kennung Eigenschaft
- 19. ObjectiveC-Blöcke Java-Äquivalent
- 20. Wie filtert man Tshark-Ergebnisse, bevor man in Datei schreibt?
- 21. 2D Dynamische Speicherzuweisung - ObjectiveC
- 22. Zweig: Wie schreibt man, wenn in_array
- 23. Wie man auf eine Webseite schreibt
- 24. Wie schreibt man sichere c-Netzwerk-Software?
- 25. Django Nose Wie schreibt man diesen Test?
- 26. Wie man tiefgestellten Text im Spielhersteller schreibt?
- 27. C# Wie schreibt man eine TextBox?
- 28. Wie schreibt/liest man auf eine Smartcard?
- 29. Wie schreibt man C++ Audio-Verarbeitungsanwendungen?
- 30. Wie schreibt man Komponententest für http Anfrage?
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 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
+1 für die Bereitstellung von Entwurfsmuster, die in einigen möglicherweise besser als Blöcke sind Situationen. – user2398029