泛型协议发布属性

问题描述 投票: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.