macOS 10.15 Catalina にも対応するアプリを SwiftUIで 作成する場合
onChange()が対応しているのは macOS 11.0以降のようです
struct test: View{ @State var toggleStatus: Bool = false var body: some View { Toggle("Toggle", isOn: $toggleStatus).onChange(of: toggleStatus){newValue in } } }
↑上記コードですと、 ↓下のエラーがでます。
x.swift:14:47: 'onChange(of:perform:)' is only available in macOS 11.0 or newer
Xcodeは、 @available(macOS 11.0, *) これで回避しろと言ってきます。
extension Binding で onChange() を作る
extension Binding { func onChange(_ action: @escaping () -> Void) -> Binding{ Binding(get: { wrappedValue }, set: { newValue in wrappedValue = newValue action() }) } } //@available(macOS 11.0, *) struct test: View{ @State var toggleStatus: Bool = false var body: some View { Toggle("Toggle", isOn: $toggleStatus.onChange { }) } }
Binding<T>が付いている SwiftUI部品ならなんでも利用できそうです。