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
'IT Share you' 카테고리의 다른 글
Pycharm의 Jupyter 노트북 (0) | 2020.11.17 |
---|---|
HTML 속성에 작은 따옴표를 사용하는 것이 맞습니까? (0) | 2020.11.17 |
BigDecimal을 사용하여 통화 작업 (0) | 2020.11.17 |
java.util.Map의 이름은 어떻게 지정해야합니까? (0) | 2020.11.17 |
gcc 명령 줄에서 문자열 리터럴을 정의하는 방법은 무엇입니까? (0) | 2020.11.17 |