Jak pisać metody lambda w Objective-C?Jak pisać metody lambda w Objective-C?
Odpowiedz
OS X 10.6 wprowadził bloki. Zobacz AlBlue's answer for examples.
Jeśli nie korzystasz z systemu Snow Leopard, możesz uzyskać kompozycję zbliżoną do funkcji, korzystając z wielu innych funkcji.
przykład za pomocą C wskaźników funkcji:
void sayHello() {
NSLog(@"Hello!");
}
void doSomethingTwice(void (*something)(void)) {
something();
something();
}
int main(void) {
doSomethingTwice(sayHello);
return 0;
}
przykład stosując wzór polecenia:
@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;
}
przykład za pomocą selektora:
@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;
}
usłyszałem Andre Pang w NSConference mówić o w jaki sposób zostaną wprowadzone bloki z następną wersją Objective-C.
Powinno to umożliwić funkcjonalne programowanie.
Edytuj: Od momentu wydania Snow Leopard tak właśnie jest. Objective-C ma teraz Blocks.
Koncepcja lambda w Objective-C jest teraz objęta ideą Blocks, które są odpowiednikiem funkcji "przekaż referencje". Oczywiście, zapewne jeden miał to już w C z ideą wskaźników funkcyjnych; bloki są po prostu sposobem przechwytywania stanu lokalnego (to jest zamykania). W rzeczywistości bloki mogą być również używane w innych językach C (na Macu) - istnieje propozycja, aby uczynić je częścią standardowej składni C.
Oto przykład definicji lambda pomnożyć dwie liczby:
int (^mult)(int, int) = ^(int a, int b) { return a*b; };
Pierwsza część deklaruje zmienną typu ^int(int,int)
a następnie przydziela go do ekspresji lambda (alias bloku), które zwraca wielokrotność z dwóch argumentów. Możesz wtedy przekazać to fn, zdefiniować je w innych miejscach itd .; możesz go używać nawet w innych funkcjach.
Oto przykład definiowania funkcję, która po wywołaniu zwraca inną funkcję:
multiplyBy = ^(int a) { return ^(int b) { return b*a; }; };
triple = multiplyBy(3);
pamiętać, że można wymieszać bloki z typów obiektów (zwykle z wykorzystaniem id
jako typ obiektu) oraz wiele nowych Obiekty danych Objective-C mają pewien rodzaj operacji na poziomie bloków. GCD używa również bloków do przekazywania dowolnych zdarzeń; należy jednak pamiętać, że GCD można również używać ze wskaźnikami funkcyjnymi.
+1, aby uzyskać szczegółową odpowiedź. – Abizern
Należy również zauważyć, że obsługa bloków została przeniesiona do wersji 10.5, a system operacyjny iPhone z projektem Plausible Blocks. http://code.google.com/p/plblocks/ – Chuck
Pamiętaj, że bloki mogą być używane w iOS 4, bez projektu Plausible Blocks. –
- 1. Czy czas wywołania metody super klasy jest ważny w ObjectiveC?
- 2. Jak pisać metody wstawiania przykładów rspec?
- 3. Używanie funkcji lambda C++ 11 w ARC ObjectiveC++ - jak zrobić to poprawnie?
- 4. Jak pisać metody init sterownika UIView w Swift
- 5. Wdrożenie ObjectiveC protokół w szybkim
- 6. Niejednoznaczne wywołanie metody z Lambda w Javie
- 7. ObjectiveC Parse Integer from String
- 8. Jak pisać GUI w Pythonie?
- 9. Jak pisać równania w html?
- 10. Jak pisać zagnieżdżoną funkcję generyczną
- 11. Wyrażenie lambda lub odwołanie do metody?
- 12. ThreadPool.QueueUserWorkItem z wyrażenia lambda i metody anonimowej
- 13. jak pisać oczekiwane awarie?
- 14. Jak pisać czytelny JavaScript
- 15. Uzyskaj nazwę metody za pomocą wyrażeń Lambda
- 16. Jak pisać zakrzywiony tekst?
- 17. Jak pisać przypadki testowe?
- 18. Jak mogę połączyć dwa wyrażenia lambda bez użycia metody Invoke?
- 19. Jak tworzyć wyrażenia lambda dla funkcjonalny interfejs mający metody rodzajowe
- 20. ObjectiveC: gdzie zadeklarować prywatne właściwości instancji?
- 21. Dlaczego nie można użyć metody prywatnej w lambda?
- 22. Wyrażenie Lambda w Powershell
- 23. Jak przechwycić "to" w funkcji lambda w lambda?
- 24. Jak pisać zakres z obiektem belongs_to?
- 25. Jak pisać przyjazny kod optymalizacji Java JIT?
- 26. Jak pisać strategie tablic Haskella
- 27. Jak pisać pliki stereo wav w Pythonie?
- 28. Jak pisać komentarze w funkcji SpecFlow?
- 29. Jak pisać literały binarne w Scali?
- 30. Jak pisać adresy URL w lateksie?
To mogło być prawdą wcześniej, ale język ma teraz bloki, które pozwalają na definiowanie rzeczywistych wyrażeń lambda. Powiedzenie tego, że jest w stanie omijać @selector() s, jak opisano powyżej, jest naprawdę użytecznym mechanizmem w zestawie narzędzi Objective-C. – AlBlue
-1 - brakujące informacje o blokach, nowa funkcja centralna, dostępna w językach C, ObjC i C++ podczas korzystania z GCC firmy Apple w nowej wersji 10.6 systemu OS X. – harms
+1 za udostępnienie wzorców projektowych, które mogą być lepsze od bloków w niektórych sytuacje. – user2398029