XLOG

[SwiftUI] onChange iOS 분기처리 본문

Swift/SwiftUI

[SwiftUI] onChange iOS 분기처리

X_PROFIT 2024. 12. 25. 23:00

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 의 분기처리를 정리해보았다.