Нашел этот ответ @Asperi, который показывает, как это сделать, как я хотел . Хитрость заключается в том, чтобы на самом деле вернуть свою копию.
typealias OnChange = ((CGFloat) -> Void)?
struct WheelView: View {
var action: OnChange
func onChanged(perform action: OnChange) -> Self {
var copy = self
copy.action = action
return copy
}
var body: some View {
Circle()
.gesture(DragGesture()
.onChanged { value in
// ? Emit the angle change
if let action = self.action {
action(0.4)
}
})
}
}
Тогда мы можем использовать наш компонент следующим образом:
struct Usage: View {
var body: some View {
WheelView()
.onChanged { value in
print("Value is \(value)")
}
}
}