2009-06-03 14 views

Odpowiedz

27

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

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

-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

+0

+1 za udostępnienie wzorców projektowych, które mogą być lepsze od bloków w niektórych sytuacje. – user2398029

3

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.

87

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.

+0

+1, aby uzyskać szczegółową odpowiedź. – Abizern

+0

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

+1

Pamiętaj, że bloki mogą być używane w iOS 4, bez projektu Plausible Blocks. –

Powiązane problemy