From e6bf03d9c0475f963b9b69d1fb28244340ac588f Mon Sep 17 00:00:00 2001 From: Muukii Date: Mon, 21 Oct 2024 15:08:31 +0900 Subject: [PATCH] Patch --- .../SwiftUISupport/Extensions/OnChange.swift | 112 ++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 Sources/SwiftUISupport/Extensions/OnChange.swift diff --git a/Sources/SwiftUISupport/Extensions/OnChange.swift b/Sources/SwiftUISupport/Extensions/OnChange.swift new file mode 100644 index 0000000000..a729f1d7b4 --- /dev/null +++ b/Sources/SwiftUISupport/Extensions/OnChange.swift @@ -0,0 +1,112 @@ +import SwiftUI + +extension View { + + public func onChange(each value: repeat each T, action: @escaping () -> Void) + -> some View + { + + if #available(iOS 17, *) { + + let box = RepeatingBox(value: (repeat each value)) + + return self.onChange( + of: box, + perform: { _ in + action() + }) + + } else { + + let box = TupleBox<(repeat each T)>( + value: (repeat each value), + isEqual: { lhs, rhs in + + for (left, right) in repeat (each lhs, each rhs) { + guard left == right else { return false } + } + return true + + }) + + return self.onChange( + of: box, + perform: { _ in + action() + }) + } + + } + +} + +private struct TupleBox: Equatable { + + static func == (lhs: TupleBox, rhs: TupleBox) -> Bool { + lhs.isEqual(lhs.value, rhs.value) + } + + let value: T + let isEqual: (T, T) -> Bool + + init( + value: T, + isEqual: @escaping (T, T) -> Bool + ) { + self.value = value + self.isEqual = isEqual + } + +} + +@available(iOS 17.0.0, *) +private struct RepeatingBox: Equatable { + + static func == (lhs: Self, rhs: Self) -> Bool { + for (left, right) in repeat (each lhs.value, each rhs.value) { + guard left == right else { return false } + } + return true + } + + let value: (repeat each T) + +} + +#if DEBUG + +private struct Book: View { + + @State var a: Int = 0 + @State var b: Int = 0 + @State var c: Int = 0 + + var body: some View { + + VStack { + + Button("Increment A") { + a += 1 + } + Button("Increment B") { + b += 1 + } + Button("Increment C") { + c += 1 + + } + .onChange(each: a, b, c) { + print("a, b, or c changed") + } + + } + + } + +} + +#Preview { + Book() +} + +#endif