iOS MVP数据转换责任

iOS MVP data conversion responsibility

假设我有 class 和 Date 属性

class SomeModel {
    ..some properties
    let date: Date = Date(timeIntervalSince1970: 1505050)
    ..more properties
}

我需要使用此转换(或任何其他转换,仅举个例子)来显示它

func createString(from date: Date) -> String {
     let formatter = DateFormatter()
     formatter.dateFormat = "MM dd yyyy HH:mm:ss"
     let stringifyDate = formatter.string(from: model.applicationDate)
     let monthSymbols = formatter.shortMonthSymbols
     let monthIndex = Calendar.current.component(.month, from: model.applicationDate)
     let monthName = monthSymbols![monthIndex-1]
     return monthName + String(stringifyDate.dropFirst(2))
}

使用 Model-View-Presenter 模式,我是否应该将 SomeModel 传递给 View 并在那里执行转换,因为其他属性是String/Int 并且很容易显示它们。或者我应该为每个 SomeModel 字段

创建属性
var someText: String {
    return model.someText
}

var stringDate: String {
    return createString(from: model.date)
}

..other properties

然后像

一样调用updateUI
func updateUI() {
    someLabel.text = presenter.someText
    dateLabel.text = presenter.stringDate
    ..other properties
}

甚至可以将两者结合起来,但这听起来像是个坏主意,因为 View 无论如何都会得到 Date 属性。

视图不应负责任何数据转换和操作。 有两种可能的方法来解决这个问题:

  1. 在模型中创建计算属性或方法,并在视图中使用它们。我更喜欢计算属性,因为代码更简洁易懂。
  2. 管理 Presenter 中的所有转换和操作 class。 class 在 MVP 模式中的目的是采用模型,做一些事情,并传递要在视图中呈现的最终数据。

两种方式都对,要看上下文。也许第二种方式更接近模式,但这取决于。

有关计算属性的一些文档: https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Properties.html#//apple_ref/doc/uid/TP40014097-CH14-ID259

对于 MVP,您希望 Presenter 层为 View 层执行所有自定义显示逻辑,而您不想对 Model 层执行任何操作,它应该只是简单地表示如何在数据库)。

首先我会在字符串扩展文件中创建一个自定义初始化,例如

extension String {

   init(from date: Date) {
       // custom logic goes here
   }
}

然后在您的相关 Presenter 中有一个 属性 调用此扩展 class 来进行数据操作,这样其他演示者也可以使用此逻辑,例如

public class Presenter {

    public var customProperty: String {

       return String.init(from: model.date)        
    }
}