gpt4 book ai didi

ios - 使用通用协议(protocol)实例化 ViewModel 数据

转载 作者:行者123 更新时间:2023-11-30 12:29:12 24 4
gpt4 key购买 nike

所以基本上我正在尝试定义一个通用 View 模型协议(protocol),我可以从中定义所有其他 View 模型...但是其中的数据需要保持通用...可以说我定义如下协议(protocol):

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()
}
}

我收到错误:

Protocol 'GenericVMProtocol' can only be used as a generic constraint because it has Self or associated type requirements

...我必须说,如果我缺少一些逻辑或我的想法是错误的,我就非常无能......所以我将不胜感激任何帮助!恩克斯:)

最佳答案

这是一个PAT (协议(protocol)关联类型)无法直接使用的问题GenericVMProtocol作为类型,因为再次 it has associated type requirements在你的情况

我不知道以下内容是否对您有帮助,但使用具有通用约束的协议(protocol)的正确方法如下:

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()
}
}

关于ios - 使用通用协议(protocol)实例化 ViewModel 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43804036/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com