Swift 具有通用协议的VIPER

Swift 具有通用协议的VIPER,swift,generics,viper,Swift,Generics,Viper,我有一个关于VIPER架构和泛型协议的有趣问题 演示者和交互者似乎进行了大量的交流(用于获取和接收数据)。 但是交互器的“输出”功能总是相同的 差不多 func dataFetched(object: JSONObject) protocol Ouput { associatedType Object func dataFetched(object: Object) } 如果你有10个模块,你将有10倍于这个函数,只有JSONObject会改变 可以用这样的方法吗 func data

我有一个关于VIPER架构和泛型协议的有趣问题

演示者和交互者似乎进行了大量的交流(用于获取和接收数据)。 但是交互器的“输出”功能总是相同的

差不多

func dataFetched(object: JSONObject)
protocol Ouput {
  associatedType Object
  func dataFetched(object: Object)
}
如果你有10个模块,你将有10倍于这个函数,只有JSONObject会改变

可以用这样的方法吗

func dataFetched(object: JSONObject)
protocol Ouput {
  associatedType Object
  func dataFetched(object: Object)
}
并选择演示者中对象的类型

我希望足够清楚。
谢谢您的帮助。

如果JSONObject是实体,演示者不应该知道它。相反,interactor应该返回可以转换为ViewModel的多形类型。然后演示者可以将此ViewModel传递给视图。因此,interactor输出可以如下所示:

func didFetched(object: ViewModelConvertible)

是,JSONObject将是应用程序中使用的模型。所以我应该在所有实体之上创建一个类,并使用该类型而不是associatedType/typealias?但是VIPER架构中没有viewModel。演示者使用view?.update(with:JSONObject)或view?.displayAlert(for:error)等方法直接与ViewController本身通信。在VIPER模型或实体中,不能在整个应用程序中使用。因为实体中的更改不应影响演示者。VIPER中的ViewModel是一个没有任何逻辑的简单结构。Presenter传递查看此ViewModels的过程,而view仅使用此ViewModel中的值设置其控件,但通过添加ViewModel,您可以添加另一个图层吗?因此,ViewModelConverable到实体的转换将在该viewModel中完成?VIPER的全部目的是创建独立的层,而在Swift中实现这一点的最佳方法是使用protocolsNope的多态性,这是不可能的。这实际上是VIPER的问题之一——抽象导致了大量的协议代码,这些代码也经常被复制。不过,您可以创建父协议。例如,
dataFetched
通常也会有一个pair函数
dataFailed(error:)
,可以抽象为父协议。嗯,有点不确定,我想避免很多协议。是的,我的协议实际上有3个函数didFetch(object:object)didFetch(objects:[objects])didFail(error:error?),但我不希望每个模型都有一个输出协议,因为它会导致有N倍的didFetch/didFail函数。。但如果不可能,我会用另一种方法。