Objective C의 블록 구문 (그리고 실제로 C, 나는 추정)은 부적절합니다. 블록을 인수로 전달 typedef
하는 것은 블록을 ing 블록 과 다르게 보이는 ivar로 선언하는 것과 다릅니다 .
빠른 참조를 위해 계속 사용할 수있는 포괄적 인 블록 선언 구문 목록이 있습니까?
Objective C의 블록 구문 (그리고 실제로 C, 나는 추정)은 부적절합니다. 블록을 인수로 전달 typedef
하는 것은 블록을 ing 블록 과 다르게 보이는 ivar로 선언하는 것과 다릅니다 .
빠른 참조를 위해 계속 사용할 수있는 포괄적 인 블록 선언 구문 목록이 있습니까?
답변:
전체적으로
return_type
객체 / 프리미티브 / 등의 유형이어야합니다. 당신은 (일반적으로 void
)blockName
만들고있는 블록의 변수 이름var_type
type object / primitive / etc이어야합니다. 인수로 전달하고 싶습니다 (매개 변수없이 공백으로 두십시오).varName
주어진 매개 변수의 변수 이름원하는만큼 많은 매개 변수를 작성할 수 있습니다.
아마도 가장 일반적인 선언 일 것입니다.
return_type (^blockName)(var_type) = ^return_type (var_type varName)
{
// ...
};
블록을 변수로 선언하는 것과 비슷하지만 미묘하게 다릅니다.
@property (copy) return_type (^blockName) (var_type);
이것은 "인수로 블록"과는 다릅니다. 이 경우 블록 인수를 원하는 메소드를 선언합니다.
- (void)yourMethod:(return_type (^)(var_type))blockName;
이것은 "매개 변수로서의 블록"과는 다릅니다. 이 경우 익명 블록으로 블록 인수를 원하는 메소드를 호출합니다. 블록 변수를 이미 선언 한 경우 변수 이름을 인수로 전달하면됩니다.
[someObject doSomethingWithBlock: ^return_type (var_type varName)
{
//...
}];
이것은 기능적으로 익명 블록이지만 변수에 블록을 할당하는 구문은 변수를 익명 블록과 동일하게 설정하는 것입니다.
^return_type (var_type varName)
{
//...
};
typedef
블록이를 통해 블록 선언 중에 다른 클래스 이름과 같이 참조 할 수있는 짧은 이름을 설정할 수 있습니다.
typedef return_type (^blockName)(var_type);
그런 다음 나중에 blockName
표준 블록 선언 구문 대신 사용하려면 간단히 대체하십시오.
이것은 아마도 블록의 유용한 활용은 아니지만 그럼에도 불구하고 그 자리를 차지할 수 있습니다. 인라인 블록은 인스턴스화 직후에 호출되는 익명 블록입니다.
^return_type (var_type varName)
{
//...
}(var);
인라인 블록은 주로 범위 오프셋에 유용하며 간단한 중괄호로 구분 된 코드 청크와 거의 같습니다.
{
//...
}
이를 통해 블록 자체를 호출하여 콜백 및 GCD 호출 중에 사용할 수있는 루프를 만들 수 있습니다. 이 인스턴스화 방법에는 ARC의 유지주기가 없습니다.
__block return_type (^blockName)(var_type) = [^return_type (var_type varName)
{
if (returnCondition)
{
blockName = nil;
return;
}
// ...
} copy];
blockName(varValue);
메소드는 블록을 반환 할 수 있습니다.
- (return_type(^)(var_type))methodName
{
// ...
}
조금 이상하게도 기능을 할 수 있습니다.
return_type (^FunctionName())(var_type)
{
// ...
}
내가 놓친 부분이 있으면 의견을 남겨 주시면 조사 / 추가하겠습니다.
blockName = (varName: var_type) -> (return_type)
언어 기능과 거의 같습니다.
BlockType ^blockVar = Anonymous Block
는 ^없이 구문 오류를 보여줍니다 :(
나는 개인적으로이 웹 사이트 ( http://fuckingblocksyntax.com )를 사용하는 것을 좋아 합니다. 이름은 블록 구문 자체보다 기억하기 쉽습니다.
잘못된 단어가 포함 된 URL을로드 할 수없는 경우 다음 미러를 사용할 수 있습니다. http://goshdarnblocksyntax.com
Typedef :
typedef void (^block)(NSString *arg);
인라인 :
void (^block)(NSString *) = ^(NSString *param) {
// do something....
};
방법:
- (void)method:(void (^)(NSString *param))handler
나는 주사위가 흔들린 후에 주사위의 값을 반환하는 클래스에 대해 completeBlock을 썼습니다.
returnType을 사용하여 typedef 정의 ( .h
위의 @interface
선언)
typedef void (^CompleteDiceRolling)(NSInteger diceValue);
@property
블록에 대한 정의 ( .h
)
@property (copy, nonatomic) CompleteDiceRolling completeDiceRolling;
finishBlock
( .h
) 로 메소드 정의
- (void)getDiceValueAfterSpin:(void (^)(NSInteger diceValue))finishBlock;
에서 이전에 정의 된 방법 삽입 .m
파일을 커밋 finishBlock
에 @property
전에 정의
- (void)getDiceValueAfterSpin:(void (^)(NSInteger diceValue))finishBlock{
self.completeDiceRolling = finishBlock;
}
completionBlock
미리 정의 된 variableType 전달 을 트리거하려면 ( completionBlock
존재 여부를 확인하는 것을 잊지 마십시오 )
if( self.completeDiceRolling ){
self.completeDiceRolling(self.dieValue);
}
typedef void (^OkBtnBlock)(id data);
typedef void (^CancelBtnBlock)();
@property (nonatomic, strong) OkBtnBlock okBtnBlock;
@property (nonatomic, strong) CancelBtnBlock cancelBtnBlock;
+ (void)foo:(OkBtnBlock)okBtn andCancel:(CancelBtnBlock)btnCancel;
Xcode 4.2에서 다시 작업해야하는 경우 비 블록 속성을 사용하는 것처럼 속성으로 선언 된 블록을 @synthesize 할 수도 있습니다. 블록 구문이 당신을 던지지 못하게하십시오.
블록 속성이 다음과 같은 경우 :
@property (copy) return_type (^blockName) (var_type);
그런 다음 @synthesize는 다음과 같습니다.
@property blockName;
건배.
@property blockName
. 나는 그것이 있어야한다고 생각 @synthesize blockName;
합니까? (블록 합성)