Ios 使用通用协议实例化ViewModel数据
所以基本上我正在尝试定义一个通用的viewmodel协议,从中我可以定义所有其他的viewmodel。。。但其中的数据需要保持通用性。。。假设我定义协议如下:Ios 使用通用协议实例化ViewModel数据,ios,swift,Ios,Swift,所以基本上我正在尝试定义一个通用的viewmodel协议,从中我可以定义所有其他的viewmodel。。。但其中的数据需要保持通用性。。。假设我定义协议如下: protocol GenericVMProtocol { associatedtype T var items: [T] { get } } 接下来,我将使我的虚拟机符合它并定义数据: class VM: GenericVMProtocol { typealias T = String var item
protocol GenericVMProtocol {
associatedtype T
var items: [T] { get }
}
接下来,我将使我的虚拟机符合它并定义数据:
class VM: GenericVMProtocol {
typealias T = String
var items: [String] = ["A", "B" , "C"]
}
目前,一切正常,但当我想让我的VC符合VMProtocol时,问题就出现了,比如:
class VC: UIViewController {
var vm: GenericVMProtocol
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
vm = VM()
super.init(nibName: nil, bundle: nil)
}
func items() {
print(vm.items)
}
required init?(coder aDecoder: NSCoder) {
fatalError()
}
}
我收到错误消息:
协议“GenericVMProtocol”只能用作一般约束
因为它具有自身或关联的类型要求
。。。我必须说,如果我缺少一些逻辑或者我的想法是错误的,我是相当无知的。。因此,我将感谢任何帮助!Tnx:)这是一个
PAT
(协议相关类型)问题,您不能直接将GenericVMProtocol
用作类型,因为在您的情况下,它也有相关的类型要求
我不知道以下内容是否对您有帮助,但使用带有通用约束的协议的正确方法如下:
protocol GenericVMProtocol {
associatedtype T
var items: [T] { get }
init()
}
class VM: GenericVMProtocol {
typealias T = String
var items: [String] = ["A", "B" , "C"]
required init() {}
}
class VC<T>: UIViewController where T:GenericVMProtocol {
var vm: T
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
vm = T()
super.init(nibName: nil, bundle: nil)
}
func items() {
print(vm.items)
}
required init?(coder aDecoder: NSCoder) {
fatalError()
}
}
协议通用vmprotocol{
关联T型
变量项:[T]{get}
init()
}
类VM:GenericVMProtocol{
typealias T=String
变量项:[字符串]=[“A”、“B”、“C”]
必需的init(){}
}
类VC:UIViewController,其中T:GenericVMProtocol{
var-vm:T
重写init(nibName-nibNameOrNil:String?,bundle-nibBundleOrNil:bundle?){
vm=T()
super.init(nibName:nil,bundle:nil)
}
func items(){
打印(vm.items)
}
必需的初始化?(编码器aDecoder:NSCoder){
法塔莱罗()
}
}