SwiftUI - 通用类型协议发布属性

问题描述 投票:0回答:1

我有 x 个符合协议的数据模型(结构),我想在我的 viewModel 中有一个代表其中一种类型的

@Pubished
属性,并访问每个属性以在 UI 中分配,为什么这种方法不可能?我得到编译器无法输入检查..

protocol HumanProtocol {
    
    associatedtype Human
        
}

    struct Female: HumanProtocol {

       typealias Human = Female

      var name:String
   }
    
    struct Male: HumanProtocol {

       typealias Human = Male

     var name:String

   }

    class HumanViewModel:ObservableObject {
    
        @Published var selectedHuman: Any HumanProtocol? 
    
          init(selectedHuman:Any HumanProtocol) {
          self.selectedHuman = selectedHuman
    }
    
   }

想要的结果:

@StateObject var humanVM = HumanViewModel(selectedHuman:Male(name:""))




 TextField("Nickname", text: $humanVM.selectedHuman.name )
                .modifier(TextFieldModifier(width: 250, height: 30))
                .padding(.top))
swift swiftui protocols property-wrapper
1个回答
0
投票

在这种情况下,使用泛型比尝试使用更好

any

class HumanViewModel<T: HumanProtocol>: ObservableObject {
    
    @Published var selectedHuman: T
    
    init(selectedHuman: T) {
        self.selectedHuman = selectedHuman
    }
    
}

struct Example: View {
    @StateObject private var vm = HumanViewModel(selectedHuman: Male(name: "Test"))
    
    var body: some View {
        TextField("", text: $vm.selectedHuman.name)
    }
}

在这里,可以推断

HumanViewModel
的类型,因为
Male
被传递给它。

© www.soinside.com 2019 - 2024. All rights reserved.