Swift 在类和结构视图之间共享数据绑定

Swift 在类和结构视图之间共享数据绑定,swift,swiftui,Swift,Swiftui,比如说,,当我从API成功或失败中获取数据时,我想显示警报,但警报需要isPresented类型是Binding这就是为什么我想使用概念共享数据,因为类和视图之间的绑定是可能的,或者有另一种方法可以做,请提前帮助。@Published属性适用于在类和视图之间共享数据observeObjects和Views 例如: class ViewModel : ObservableObject { struct APIError : Identifiable { var id = U

比如说,,当我从API成功或失败中获取数据时,我想显示警报,但警报需要isPresented类型是Binding这就是为什么我想使用概念共享数据,因为类和视图之间的绑定是可能的,或者有另一种方法可以做,请提前帮助。

@Published
属性适用于在类和视图之间共享数据
observeObject
s和
View
s

例如:

class ViewModel : ObservableObject {
    struct APIError : Identifiable {
        var id = UUID()
        var message : String
    }
    
    @Published var error : APIError?
    
    func apiCall() {
        DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
            self.error = APIError(message: "Error message")
        }
    }
}

struct ContentView : View {
    @StateObject var viewModel = ViewModel()
    
    var body: some View {
        VStack {
            Text("Hello, world!")
                .alert(item: $viewModel.error) { item in
                    Alert(title: Text(item.message))
                }
        }
        .onAppear {
            viewModel.apiCall()
        }
    }
}
您也可以使用自定义绑定来实现这一点,但它有点混乱。上面的例子肯定是我的目标

class ViewModel : ObservableObject {
    @Published var errorMessage : String?
    
    var alertBinding : Binding<Bool> {
        .init {
            self.errorMessage != nil
        } set: { newValue in
            if !newValue { self.errorMessage = nil }
        }

    }
    
    func apiCall() {
        DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
            self.errorMessage = "Error!"
        }
    }
}

struct ContentView : View {
    @StateObject var viewModel = ViewModel()
    
    var body: some View {
        VStack {
            Text("Hello, world!")
                .alert(isPresented: viewModel.alertBinding) {
                    Alert(title: Text(viewModel.errorMessage ?? "(unknown)"))
                }
        }
        .onAppear {
            viewModel.apiCall()
        }
    }
}
类视图模型:ObserveObject{
@发布的var错误消息:字符串?
var-alertBinding:Binding{
.init{
self.errorMessage!=nil
}集合:{newValue in
如果!newValue{self.errorMessage=nil}
}
}
func apiCall(){
DispatchQueue.main.asyncAfter(截止日期:.now()+1){
self.errorMessage=“错误!”
}
}
}
结构ContentView:View{
@StateObject变量viewModel=viewModel()
var body:一些观点{
VStack{
文本(“你好,世界!”)
.alert(显示:viewModel.alertBinding){
警报(标题:文本(viewModel.errorMessage??(未知)”)
}
}
奥纳佩尔先生{
viewModel.apiCall()
}
}
}

是的,一切都完成了,先生