블록 선언 구문 목록


277

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

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


9
블록 프로그래밍 토픽 안내서의 "블록 선언 및 생성"에 어떤 문제가 있습니까?
jscs

블록 속성 사용에 대한 간단한 설명 : stackoverflow.com/a/20760583/294884
Fattie

답변:


696

블록 선언 구문 목록

전체적으로

  • 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)

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


1
@pcperini 멋진 목록! 그리고 변수 선언에서 typedef의 블록 정의를 사용하는 방법 (목록의 첫 번째 항목)? 논리 BlockType ^blockVar = Anonymous Block는 ^없이 구문 오류를 보여줍니다 :(
esp

14
어쨌든 내 두뇌는 블록 선언에 대한 모든 다양한 구문을 기억할 수 없습니다. 아마이 대답을 일주일에 한 번 볼 것입니다. 이것에 대해 10 개의 찬성 투표를 해주시길 바랍니다.
벤 바론

36
이와 같은 답변을 위해서는 StackOverflow 명예의 전당이 필요합니다.
bejonbee

1
인쇄용 뷰어와 함께 사용하기 위해 이것을 마크 다운으로 변환했습니다. 능숙한! gist.github.com/swizzlr/6268955
Swizzlr

20
나는 이것이 문신으로 필요하다고 생각합니다.
Isaac Overacker 2018

83

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

http://fuckingblocksyntax.com

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

fuckingblocksyntax 웹 사이트


1
웹 사이트의 완벽한 이름 .. : D
Vineeth

39

Typedef :

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

인라인 :

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

방법:

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

이 대답은 결국 그렇게 복잡하지 않다는 것을 보여줍니다 ... 혼합하고 일치시키는 세 가지 다른 구문.
Joseph Chen

4
허용되는 답변은 불필요한 팽창이있는이 답변의 사본 일뿐입니다.
Erik Aigner

16

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

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


11

나는 주사위가 흔들린 후에 주사위의 값을 반환하는 클래스에 대해 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);
    }

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

전체 프로세스를 단계별로 설명하는 것이 좋을 것입니다. 만약 당신이 iOS를 처음 접한다면 블록을 이해하기 어렵습니다 ...
Alex Cio

3

Xcode 4.2에서 다시 작업해야하는 경우 비 블록 속성을 사용하는 것처럼 속성으로 선언 된 블록을 @synthesize 할 수도 있습니다. 블록 구문이 당신을 던지지 못하게하십시오.

블록 속성이 다음과 같은 경우 :

@property (copy) return_type (^blockName) (var_type);

그런 다음 @synthesize는 다음과 같습니다.

@property blockName;

건배.


안녕하세요, 당신은 다시 확인하실 수 있습니다 .. 난 그냥 당신을 따라하려고했다 @property blockName. 나는 그것이 있어야한다고 생각 @synthesize blockName;합니까? (블록 합성)
jeet.chanchawat

죄송합니다 ... 이미 (간접적으로)이 엑스 코드 (7)와 함께 작동 실 거예요 언급 당신을 기다립니다
jeet.chanchawat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.