Swift5.0 중첩된 Optionals(??) 평면화 하기 SE-0230

안녕하세요~! 최근 버전에서는 나타나지 않지만 Swift4.2 이하 스위프트 버전에서는 언래핑 작업이나 try?로

옵셔널 값을 가져올때 중첩된 ????을 볼 수 있었습니다.

하지만 Swift5.0부터는 그렇게 처리되지 않는데요

아래 예제코드를 함께 보시면서 어떻게 달라졌는지 보겠습니다.

struct User {
    var id: Int

    init?(id: Int) {
        if id < 1 {
            return nil
        }

        self.id = id
    }

    func getMessages() throws -> String {
        // complicated code here
        return "No messages"
    }
}

User 구조체 안에 옵셔널 초기화가 있습니다. 조건에 맞는 아이디가 들어와야만 유저가 생성되도록 하기 위함 입니다.

유저는 메시지를 얻을 수 있는 메소드가 하나 있습니다. 이 메소드는 throws를 통해 에러를 던질 수 있습니다.

 

let user = User(id: 1)
let messages = try? user?.getMessages()

이제 유저를 하나 생성하고 메시지를 얻어 오겠습니다. 

기존 Swift4.2 이전 이하 에서는 결과값이 ??으로 옵셔널이 중첩으로 결과를 가져다 주었습니다. (결과: String??)

하지만 Swift5.0 이상 부터는 try? 결과값이 옵셔널이면 한번더 옵셔널로 래핑하지 않아서 결과값은 String?으로 나타나게 됩니다.

 

func doubleOptionalInt() throws -> Int?? {
    return 3
}

// Swift 4: 'Int???' Optional(Optional(Optional(3)))
// Swift 5: 'Int??' Optional(Optional(3))
let x = try? doubleOptionalInt()
print(x)

위 예제 함수에서는 중첩된 옵셔널 값을 리턴받고 있습니다. 

안에 코드안에 주석을 보시면

Swift4에서는 try?를 호출 했을때 중첩을 한번더 진행되는 결과값으로 보여집니다.

Swift5부터는 try?에 대한 옵셔널은 처리되지않고 결과 그대로 ??로 된 결과값 그대로를 가져오는것을 볼 수 있습니다.

 

오늘은 여기까지입니다. 감사합니다~!

 

출처:

https://www.hackingwithswift.com/swift/5.0/flattening-optionals

https://github.com/apple/swift-evolution/blob/main/proposals/0230-flatten-optional-try.md