Ios 使用通用协议实例化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

所以基本上我正在尝试定义一个通用的viewmodel协议,从中我可以定义所有其他的viewmodel。。。但其中的数据需要保持通用性。。。假设我定义协议如下:

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){
法塔莱罗()
}
}