iOS MVP数据转换责任

时间:2018-01-31 10:55:25

标签: ios swift architecture mvp

我们说我的课程有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))
}

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

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

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

..other properties

然后像{/ p>一样调用updateUI

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

甚至可以将两者结合起来,但听起来不错,因为View无论如何都会获得Date属性。

2 个答案:

答案 0 :(得分:2)

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

  1. 在模型中创建计算属性或方法,并在视图中使用它们。我更喜欢计算属性,因为代码更干净,更容易理解。
  2. 管理Presenter类中的所有转换和操作。这个类在MVP模式中的目的是获取模型,做一些事情,并传递最终数据以在视图中呈现。
  3. 两种方式都是正确的,这取决于具体情况。也许第二种方式更接近于模式,但它取决于。

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

答案 1 :(得分:0)

使用MVP,您希望Presenter图层为View图层执行所有自定义显示逻辑,并且您不希望对模型图层执行任何操作,它应该只是如何在对象中定义对象的简单表示。数据库)。

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

extension String {

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

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

public class Presenter {

    public var customProperty: String {

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