38. 일반적인 블록 유형에 typedef 만들기
제38조: 자주 사용하는 블록 유형에 typedef 만들기
각 블록에는 고유 유형(inherent type)이 있으므로 적절한 유형의 변수에 값을 지정할 수 있습니다.이 유형은 블록이 받아들인 매개 변수와 되돌아오는 값으로 구성됩니다.
블록을 변수에 부여하려면 그 유형에 주의해야 한다.변수 유형 및 관련 대입 문은 다음과 같습니다.
int someInt = 0;
int (^variableName)(BOOL flag, int value) = ^(BOOL flag, int value)
{
return someInt;
};
이 유형은 일반적인 유형과는 크게 다른 것 같지만, 함수 바늘에 익숙해지면 눈에 익어 보일 것이다.블록 유형의 구문은 다음과 같습니다.
return_type (^block_name)(parameters)
다른 유형의 변수와 달리 블록 변수를 정의할 때 변수 이름을 오른쪽에 두지 말고 유형에 두어야 한다.이런 문법은 매우 기억하기 어렵고 읽기도 매우 어렵다.이를 감안하여, 우리는 자주 사용하는 블록 유형에 별명을 붙여야 한다. 특히 코드를 API로 발표해서 다른 사람이 사용할 수 있도록 할 때, 더욱 이렇게 해야 한다.개발자는 블록의 용도를 표시하기 위해 더 읽기 쉬운 이름을 지을 수 있으며, 블록의 유형을 그 뒤에 숨길 수 있다.
복잡한 블록 유형을 숨기려면 C 언어에서 유형 정의(type definition)라는 특성을 사용해야 합니다.typedef 키워드는 유형에 읽기 쉬운 별칭을 지정하는 데 사용됩니다.
typedef int (^EOCSomeBlock)(BOOL flag, int value);
변수를 설명할 때, 이름을 형식 중간에 놓고, 앞에 '^' 기호를 붙여야 하며, 새로운 형식을 정의할 때도 이렇게 해야 한다.이제 더 이상 복잡한 블록 유형으로 변수를 만들지 않고 새 유형을 사용하면 됩니다.
EOCSomeBlock block = ^(BOOL flag, int value)
{
return someInt;
};
다른 변수를 정의할 때와 마찬가지로 변수 유형은 왼쪽에 있고 변수 이름은 오른쪽에 있습니다.클래스 안의 일부 방법은 블록으로 파라미터를 만들어야 할 수도 있다. 예를 들어 비동기적인 작업을 수행할 때 사용하는'completion handler'(작업이 끝난 후에 실행되는 처리 프로그램) 파라미터는 블록이다. 이런 상황에 부딪히면 정의를 통해 코드를 더욱 쉽게 읽을 수 있다.
정의 방법 매개 변수에 사용되는 블록 형식 문법은 변수를 정의할 때와 다르다는 것을 주의하십시오.방법 서명 중의 매개 변수 형식을 한 단어로 쓸 수 있다면 읽기가 훨씬 편할 것이다.매개변수 유형에 별칭을 지정한 다음 이 이름을 사용하여 정의할 수 있습니다.
typedef void (^EOCCompletionHandler)(NSData *data, NSError *error);
- (void)startWithCompletionHandler:(EOCCompletionHandler)completion;
현재 우수한 통합 개발 환경(Integrated Development Environment, IDE)은 모두 자동으로 유형 정의를 전개할 수 있기 때문에typedef라는 기능은 매우 실용적이다.
유형 정의를 사용하면 블록의 유형 서명을 재구성할 때 편리하다는 장점도 있다.예를 들어 원래의 completion handler 블록에 매개 변수를 추가하여 임무를 완성하는 데 걸리는 시간을 표시하려면 유형 정의 문장을 수정하면 된다.
typedef void (^EOCCompletionHandler)(NSData *data, NSTimeInterval duration, NSError *error);
수정 후에 이 유형의 정의를 사용한 곳, 예를 들어 방법 서명처는 컴파일할 수 없을 뿐만 아니라 같은 오류를 보고하기 때문에 개발자는 이것에 따라 하나하나 복구할 수 있다.
가장 좋은 것은 블록 형식의 클래스에서 이러한 typedef를 정의하는 것입니다. 또한 이 클래스의 이름을 typedef가 정의한 새로운 형식 이름 앞에 붙여야 블록의 용도를 설명할 수 있습니다.typedef로 같은 블록 서명 형식에 여러 개의 별명을 만들 수 있습니다.
Mac OS X와 iOS의 Accounts 프레임워크가 그 예입니다.프레임에서 다음 두 유형의 정의문을 찾을 수 있습니다.
typedef void(^ACAccountStoreSaveCompletionHandler)(BOOL success, NSError *error);
typedef void(^ACAccountStoreRemoveCompletionHandler)(BOOL success, NSError *error);
typedef void(^ACAccountStoreRequestAccessCompletionHandler)(BOOL granted, NSError *error);
형식 정의의 서명은 같지만 다른 곳에 사용됩니다.개발자는 유형 별명과 서명에 있는 파라미터를 보면 이 유형의 용도를 쉽게 이해할 수 있다.
이와 비슷하다. 만약에 여러 종류가 비슷하지만 각기 다른 비동기 임무를 수행해야 하고 이 몇 종류가 같은 계승 체계에 넣지 못한다면 각 종류는 자신의completionhandler 유형이 있어야 한다.이 몇 개의completionhandler의 서명은 완전히 같을 수도 있지만, 클래스마다 각각 하나의 별명을 사용자 정의하고, 같은 이름을 공용하지 않는 것이 가장 좋다.반대로 이러한 클래스가 같은 계승에 포함될 수 있다면 유형 정의의 문장을 초클래스에 놓아 각 하위 클래스가 사용하도록 해야 한다.
요점
4
4
4
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.