BLOG main image
분류 전체보기 (92)
Cocoa Touch (11)
Cocoa (10)
Objective-C (13)
Swift (6)
Development (11)
Tools (11)
Books (7)
etc (21)
Application release (1)
Document Project (1)
106,256 Visitors up to today!
Today 14 hit, Yesterday 5 hit
daisy rss
tistory 티스토리 가입하기!
2015. 6. 19. 17:53


어떤 함수 안에서 특정 변수의 조건이 만족될 때 실행되어야 하는 코드가 있다고 하자

if-let문을 사용하게 되면 아래와 같이 if-let 피라미드를 쌓아 올리게 된다.


        if let id = info[“id"] as? NSNumber {

            if let userId = info[“userId"] as? NSNumber {

//  구현

            }

        }

        return



이렇게 피라미드가 쌓이는 꼴을 못보겠다면 다음과 같은 방법도 있다.


        if let id = info[“id"] as? NSNumber,

           let userId = info[“userId"] as? NSNumber {

// 구현

}

return


하지만 이 역시 별로 예뻐보이지는 않는다. 그래서 early exit를 하는 코드를 작성하기로 한다.


        let id = info[“id"] as? NSNumber

        if id == nil {

            return

        }

        let userId = info[“userId"] as? NSNumber

        if userId == nil {

            return

        }


뭔가 주절 주절 널어지는 느낌을 지울 수 없다.

그래 guard를 한번 써보자.


        guard let id = info[“id"] as? NSNumber,

              let userId = info[“userId"] as? NSNumber else {

                return

        }


이거나 if-let,let else 나... 아래를 보자. 어차피 else가 들어가긴 마찬가지 아닌가?


        if let id = info[“id"] as? NSNumber,

           let userId = info[“userId"] as? NSNumber { } else {

                return

        }


 게다가 나는 id나 userId같은 변수는 필요없다. 안쓰니까 친절하게 워닝까지 내어준다. let을 제거하기로 마음을 먹는다.


        guard info["id"] as? NSNumber != nil && info["userId"] as? NSNumber != nil else {

            return

        }


그렇게 하니 이번에는 조건이 뒤집어진다. 그러니까 “id도 있고 userId도 있으면”이 아니면 return인게다. 이건 말을 마구 꼬으는 느낌이다.

이걸 그냥 if문을 사용하면 아래와 같아진다.


        if info["id"] as? NSNumber == nil || info["userId"] as? NSNumber == nil {

            return

        }


id가 없거나 userId가 없으면 return이다. 훨씬 간결하네.

그럼 우리는 이것을 ObjC에서는 어떻게 표현했는지 보자.


        if (![info objectForKey:@"id"] || ![info objectForKey:@"userId"]) {

            return

        }

        

으응???


그래서 그나마 가장 합리적인 선택... 아래와 같은 방법을 쓰기로 했다.


        guard let _ = scheduleInfo["id"] as? NSNumber, let _ = scheduleInfo["userId"] as? NSNumber else {

            return

        }

Name
Password
Homepage
Secret