我想將一個@Published變數的系結從 my 內部傳遞ObservableObject到一個結構體,以便它的值可以在閉包內更改。我無法讓它正常作業。下面是我的代碼的簡化版本:
final class OnboardingStateController: ObservableObject {
@Published var shouldHide: Bool = false
func go() {
MyLogic.fooBar(
shouldHide: shouldHide // error appears here Cannot convert value of type 'Bool' to expected argument type 'Binding<Bool>'
)
}
}
struct MyLogic {
static func fooBar(shouldHide: Binding<Bool>) {
... SomeClass({ shouldHide.wrappedValue = true })
}
}
我該怎么做呢?
uj5u.com熱心網友回復:
這是一個替代方案,Binding需要一個 SwiftUIView來保持更新,因為它的DynamicProperty一致性
import SwiftUI
struct OnboardingStateView: View {
@StateObject var vm: OnboardingStateController = OnboardingStateController()
var body: some View {
VStack{
Button("go", action: {
vm.go()
})
Text(vm.shouldHide.description)
}
}
}
final class OnboardingStateController: ObservableObject {
@Published var shouldHide: Bool = false
func go() {
//This uses a completion handler vs passing the `Binding`
MyLogic.fooBar(
shouldHide: { shouldHide in
self.shouldHide = shouldHide
}
)
}
}
struct MyLogic {
static func fooBar(shouldHide: (Bool) -> Void) {
let value = Bool.random() //.. SomeClass({ shouldHide.wrappedValue = true })
shouldHide(value)
}
}
struct OnboardingStateView_Previews: PreviewProvider {
static var previews: some View {
OnboardingStateView()
}
}
uj5u.com熱心網友回復:
不太清楚你為什么需要Binding那里,但如果那里真的仍然需要它,那么你可以即時生成它,比如
func go() {
MyLogic.fooBar(
shouldHide: Binding(get: { self.shouldHide }, set: { self.shouldHide = $0 })
)
}
注意:它是簡化的變體,在其中self被捕獲,如果您需要避免它,那么您會考慮[weak self]在每個閉包中使用。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/387242.html
