Objective-C 기초

블록 (Block)

nightohl 2019. 2. 18. 15:42
반응형

블록 (Block)


블록이란 코드의 묶음이다.

코드의 묶음이므로 코드의 성질을 따서 묶음의 코드를 실행할 수도 있고,

하나로 묶인 코드 묶음을 하나의 객체로 취급할 수도 있다.


즉, 코드의 성질객체의 성질을 모두 띈다.


따라서 블록(); 호출 시 메소드 처럼 동작하며 블록 안의 명령 코드들이 실행되고,

객체의 성질을 빌려 메소드 호출 시 파라미터로 넘길 수도 있고, 프로퍼티 형식 혹은 반환 형식도 될 수도 있다.



블록 선언과 구현


인자가 (void)라면 생략해도 됨.



블록 사용(호출) - 블록의 코드 성질


int main(int argc, const char * argv[]) {

    @autoreleasepool {

        void (^greeting)(void) = ^(void){

            NSLog(@"Hello World");

        };

        greeting();

        

        int (^sum)(int, int) = ^(int i, int j){

            return i+j;

        };

        NSLog(@"3 + 4 = %d",sum(3,4));

    }

    return 0;

}


==> 결과 :

2019-02-18 15:16:50.181129+0900 Study[8770:1469837] Hello World

2019-02-18 15:16:50.181333+0900 Study[8770:1469837] 3 + 4 = 7

Program ended with exit code: 0


블록을 파라미터로 - 블록의 객체 성질


★stop은 객체를 전부 순환하면 YES가 되어 반복이 종료되는데, 임의로  *stop = YES를 주어 원하는 시점에서 반복을 종료시킬 수 있다.


#import <Foundation/Foundation.h>

#import "Rectangle.h"


int main(int argc, const char * argv[]) {

    @autoreleasepool {


        NSArray *array = @[@"1"@"2"@"3"@"4"@"5"@"6"];


        NSLog(@"1st Test Start ~!");

        //블록을 인라인 방식으로 메소드의 인자로 주는 방법.

        [array enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {

            NSLog(@"Index : %lu Element : %@", idx, obj);

        }];

        

        NSLog(@"\n\n");


        NSLog(@"2nd Test Start ~!");

        //별도로 블록을 정의 한 후 블록을 인자로 넘기는 방법.

        void(^itemOfBlock)(id,NSUInteger, BOOL*)=^(id obj, NSUInteger idx, BOOL *stop){

            NSLog(@"Index : %lu Element : %@", idx, obj);

            

            if(idx == 3)

                *stop = YES;

        };

        [array enumerateObjectsUsingBlock:itemOfBlock];

    }

    return 0;

}


==> 결과 : 

2019-02-18 16:48:07.437438+0900 Study[9068:1553810] 1st Test Start ~!

2019-02-18 16:48:07.437690+0900 Study[9068:1553810] Index : 0 Element : 1

2019-02-18 16:48:07.437729+0900 Study[9068:1553810] Index : 1 Element : 2

2019-02-18 16:48:07.437754+0900 Study[9068:1553810] Index : 2 Element : 3

2019-02-18 16:48:07.437771+0900 Study[9068:1553810] Index : 3 Element : 4

2019-02-18 16:48:07.437786+0900 Study[9068:1553810] Index : 4 Element : 5

2019-02-18 16:48:07.437801+0900 Study[9068:1553810] Index : 5 Element : 6

2019-02-18 16:48:07.437814+0900 Study[9068:1553810] 

2019-02-18 16:48:07.437826+0900 Study[9068:1553810] 2nd Test Start ~!

2019-02-18 16:48:07.437841+0900 Study[9068:1553810] Index : 0 Element : 1

2019-02-18 16:48:07.437857+0900 Study[9068:1553810] Index : 1 Element : 2

2019-02-18 16:48:07.437889+0900 Study[9068:1553810] Index : 2 Element : 3

2019-02-18 16:48:07.437904+0900 Study[9068:1553810] Index : 3 Element : 4

Program ended with exit code: 0


이후에도


프로퍼티 선언 시 자료형으로, 혹은 메소드 반환 타입으로도 사용 가능.

예시는 생략.

반응형

'Objective-C 기초' 카테고리의 다른 글

NSString 클래스  (0) 2019.02.19
구조체 Struct  (0) 2019.02.18
NSData 다루기 (바이너리 데이터 저장/복원)  (0) 2019.02.18
아카이빙(Archiving)  (0) 2019.02.16
프로토콜 (Protocol)  (0) 2019.02.15