[objective-c] 블록 선언 구문 목록

Objective C의 블록 구문 (그리고 실제로 C, 나는 추정)은 부적절합니다. 블록을 인수로 전달 typedef하는 것은 블록을 ing 블록 과 다르게 보이는 ivar로 선언하는 것과 다릅니다 .

빠른 참조를 위해 계속 사용할 수있는 포괄적 인 블록 선언 구문 목록이 있습니까?



답변

블록 선언 구문 목록

전체적으로

  • return_type객체 / 프리미티브 / 등의 유형이어야합니다. 당신은 (일반적으로 void)
  • blockName 만들고있는 블록의 변수 이름
  • var_typetype 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)

언어 기능과 거의 같습니다.


답변

나는 개인적으로이 웹 사이트 ( http://fuckingblocksyntax.com )를 사용하는 것을 좋아 합니다. 이름은 블록 구문 자체보다 기억하기 쉽습니다.

http://fuckingblocksyntax.com

잘못된 단어가 포함 된 URL을로드 할 수없는 경우 다음 미러를 사용할 수 있습니다. http://goshdarnblocksyntax.com

fuckingblocksyntax 웹 사이트


답변

Typedef :

typedef void (^block)(NSString *arg);

인라인 :

void (^block)(NSString *) = ^(NSString *param) {
  // do something....
};

방법:

- (void)method:(void (^)(NSString *param))handler


답변

Xcode 4 스 니펫 라이브러리에는 블록 typedef 및 인라인 블록에 대한 템플릿이 변수로 포함되어 있습니다. 자동 완성 ( typedefblockinlineblock)을 통해 사용할 수도 있습니다 .

메소드에 대한 인수로 블록의 경우 a를 선언 한 typedef다음 간단히 사용하는 것이 좋습니다 . 코드를 훨씬 쉽게 읽을 수 있습니다.


답변

나는 주사위가 흔들린 후에 주사위의 값을 반환하는 클래스에 대해 completeBlock을 썼습니다.

  1. returnType을 사용하여 typedef 정의 ( .h위의 @interface선언)

    typedef void (^CompleteDiceRolling)(NSInteger diceValue);
  2. @property블록에 대한 정의 ( .h)

    @property (copy, nonatomic) CompleteDiceRolling completeDiceRolling;
  3. finishBlock( .h) 로 메소드 정의

    - (void)getDiceValueAfterSpin:(void (^)(NSInteger diceValue))finishBlock;
  4. 에서 이전에 정의 된 방법 삽입 .m파일을 커밋 finishBlock@property전에 정의

    - (void)getDiceValueAfterSpin:(void (^)(NSInteger diceValue))finishBlock{
        self.completeDiceRolling = finishBlock;
    }
  5. 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;

건배.