안녕하세요~! 최근 버전에서는 나타나지 않지만 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
'Apple > Apple_Swift' 카테고리의 다른 글
Swift5.1 구조체 멤버별 이니셜라이저(Memberwise Initializer)의 기본값 합성 SE-0242 (0) | 2023.01.16 |
---|---|
Swift5.0 SE-0225 배수 구하기 isMultiple(of:) (0) | 2023.01.11 |
Swift5.0 향후 변경 될 수 있는 Enum(열거형) switch @unknown 속성 처리 SE-0192 (0) | 2023.01.03 |
Swift 5.0 Result Type 소개 (에러 처리를 쉽고 깔끔하게 결과는 명확하게 SE-0235) (0) | 2022.12.27 |
Swift5.0 Character Properties (띄어쓰기, 공백, 숫자, 소문자 등등.. 확인 가능해요) SE-0221 (0) | 2022.12.26 |