iOS) Shadowing 에 대해서 생각해보자
내용
- Swift 5.7 부터 옵셔널 변수를 언래핑하는 작업이 개선될 예정입니다. 이와 함께 Shadowing 에 대해서 알아봅시다.
Shadowing 이란?
우리는 언래핑을 할 때 안전하게 진행하기 위해서 옵셔널 바인딩을 합니다.
var x: Int?
if let x = x {
// do something with the new x
}
// or
guard let x = x { return }
그리고우리는 결과적으로 x 라는 이름의 새 상수를사용하게 됩니다.
이 작업을 Shadowing 이라고 합니다. (새로운 상수가 언래핑 하고자 했던 옵셔널 변수의 그림자와 같기 때문이라고 합니다.)
실제로 우리가 사용하는 변수의 이름은 더 길고 때로는 훨씬 더 깁니다. 예를들어
var lastTimeUserEnteredTheApp: Date?
if let lastTimeUserEnteredTheApp = lastTimeUserEnteredTheApp {
// do something with the new variable
}
이러한 긴 이름의 옵셔널 변수는 확정된 언래핑 변수 코드를 생성합니다. 즉, 어쩔 수 없이 긴 변수명을 두번이나 사용하게 된다는 것이지요.
그러면 이름을 줄이면 되는 것 아닐까요?
var lastTimeUserEnteredTheApp: Date?
if let date = lastTimeUserEnteredTheApp {
// do something with the new variable
}
이로써 date 로 변수명의 길이를 줄였지만, date 가 무엇을 의미하는지는 불분명 해졌습니다.
적합한 네이밍은 가독성이 좋은 코드를 위해서는 중요한 역할을 합니다. 그래서 옵셔널 변수에 대한 새로운 상수의 변수명을 지정하는 행위 즉, Shadowing 에 대해서 위와 같이 고찰해볼 사항들이 있습니다.
이제 본론입니다! Swift 5.7 은 이러한 상황을 처리하는 흥미로운 새 접근 방식을 가집니다.
**Shortening Shadowing**
var x: Int?
if let x = x {
// do something with the new x
}
- 위의 코드를 아래와 같이 짧게 작성할 수 있습니다. 와우
If let x {
// do something with the new x
}
변수명이 길어질 경우, 이 방식은 훨씬 유용할거에요.
if let lastTimeUserEnteredTheApp {
// do something
}
// 또다른 shadowing unwrapping 방법에도 적용 가능합니다.
guard let lastTimeUserEnteredTheApp else {return}
하지만, Swif 5.7 에서 허용하는 이러한 방식이 단점도 있습니다.
단점
우리는 앞서 길더라도 = x
를 사용해서 context 즉, 문맥을 제공할 수 있었어요. 하지만 새로운 방식은 x
를 새로운 변수처럼 느끼게 해줍니다.
if var x {
}
앞서 Shadowing 의 단점 중 중복 변수를 만드는 점도 있었습니다. 그러나 이 새로운 방식은 이러한 Shadowing 을 막지 못하고, optional 변수를 숨기는 결과를 제공하게 됩니다.
앞으로 Swift 5.7 버전이 적용되면 사용하면서 느껴봐야할 것 같다.
출처:
Swift 5.7: Unwrapping Optionals Gets an Improvement
swift-evolution/0345-if-let-shorthand.md at main · apple/swift-evolution