일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- toolbarvisibility
- dataflow
- 네트워크
- stateobject
- Network
- gesture
- combine
- withAnimation
- 달력
- avsession
- SwiftUI
- Animation
- WWDC
- iphone
- CS
- state
- ios
- swift
- view
- auth
- GCD
- firebase
- 최적화
- arkit
- authentication
- UIKit
- RxSwift
- Performance
- Concurrency
- 접근성제어
Archives
- Today
- Total
XLOG
[SwiftUI] onChange iOS 분기처리 본문
SwiftUI 를 사용하다가 보면 .toolbar 나 .onChange 같은 함수들이 iOS 17.0 을 기준으로 deprecated 되어 분기처리를 해야하는 경우를 마주하게 된다. 하지만 매번 사용하는 곳에서 분기처리 하는 코드를 사용하는 건 비효율적이기에 View 의 extension 을 사용하면 중복된 코드를 줄일 수 있다.
먼저 onChange의 변화점에서 공통점을 찾아보자.
바뀐점은 17 이상에선 initial 이라는 인자를 받는데 이건 initial 될 때 액션을 발생시킬지를 결정하는 값이다.
그리고 두 번째로는 변화값을 받아서 전달해주는 action handler 가 17 이전에는 바뀐 값 하나만을 전달해줬다며, 17 이상부턴 바뀌기 전과 후 모두를 전달해준다. 여기서 공통점은 결국 어떠한 값(value)이 뭐로 바뀌었는지 이기에, 17 이전의 인자들로 구성하기로 결정했다.
extension View {
@ViewBuilder
public func compatibleOnChange<V>(of value: V, perform action: @escaping (V) -> Void) -> some View where V: Equatable {
if #available(iOS 17.0, *) {
self
.onChange(of: value) { _, newValue in
action(newValue)
}
} else {
self
.onChange(of: value, perform: { value in
action(value)
})
}
}
}
사실 onChange 의 경우 사용이 많진 않지만, toolbar 의 경우엔 18.2 로 deprecated 되었다.
그렇기에 작년에 했던 View의 Instance Method 의 분기처리를 정리해보았다.
'Swift > SwiftUI' 카테고리의 다른 글
[SwiftUI] VoiceOver 사용자를 위한 Accessibility 요소 적용기 (0) | 2024.12.22 |
---|---|
[SwiftUI] Observation (feat iOS 17, 써야하는 이유) (2) | 2024.08.17 |
[최적화] View 의 Update 를 최소화 하는 방법 (0) | 2024.07.01 |
[DataFlow] State, Binding, StateObject, ObservedObject, EnvironmentObject 는 무엇이고 차이는? (0) | 2024.07.01 |
[SwiftUI] Environment 활용하기 (0) | 2024.06.25 |