IT Share you

Objective-C에서 람다 메서드를 작성하는 방법은 무엇입니까?

shareyou 2020. 11. 17. 21:24
반응형

Objective-C에서 람다 메서드를 작성하는 방법은 무엇입니까?


Objective-C에서 람다 메서드를 작성하는 방법은 무엇입니까?


Objective-C의 람다 개념은 이제 참조에 의한 전달 함수와 동일한 블록 이라는 개념으로 캡슐화됩니다 . 물론, 아마도 함수 포인터라는 아이디어로 이미 C에서 그것을 가지고있을 것입니다. 블록은 로컬 상태를 캡처하는 방법 일뿐입니다 (즉, 클로저 일 수 있음). 실제로 블록은 다른 C 언어 (Mac)에서도 사용할 수 있습니다. 블록을 표준 C 구문의 일부로 만드는 제안이 있습니다.

다음은 두 숫자를 곱하기 위해 람다를 정의하는 예입니다.

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

첫 번째 부분은 유형의 변수를 선언 한 ^int(int,int)다음 두 인수의 배수를 반환하는 람다 식 (블록)에 할당합니다. 그런 다음 fn을 전달하고 다른 위치에서 정의 할 수 있습니다. 다른 기능에서도 사용할 수 있습니다.

다음은 호출 될 때 다른 함수를 반환하는 함수를 정의하는 예입니다.

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

블록을 객체 유형 (일반적으로 객체 유형으로 사용 id)과 혼합 할 수 있으며 많은 새로운 Objective-C 객체 데이터 구조에는 일종의 블록 수준 작업이 있습니다. GCD는 또한 임의의 이벤트를 전달하기 위해 블록을 사용합니다. 그러나 GCD는 함수 포인터와 함께 사용할 수도 있습니다.


OS X 10.6은 블록을 도입했습니다. 예제는 AlBlue의 답변을 참조하십시오 .

Snow Leopard를 사용하지 않는 경우 다양한 다른 기능을 사용하여 기능 구성에 가까운 것을 얻을 수 있습니다.

C 함수 포인터를 사용하는 예 :

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

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

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

명령 패턴을 사용한 예 :

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

선택기를 사용한 예 :

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

NSConference에서 André Pang이 Objective-C의 다음 버전에서 블록이 어떻게 도입 될지에 대해 이야기하는 것을 들었습니다.

이것은 함수형 프로그래밍을 허용해야합니다.

편집 : Snow Leopard가 출시 된 이후로 이것이 사실입니다. Objective-C에는 이제 Blocks가 있습니다.

참고 URL : https://stackoverflow.com/questions/943992/how-to-write-lambda-methods-in-objective-c

반응형