我们说我的课程有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
属性。
答案 0 :(得分:2)
视图不应对数据的任何转换和操作负责。 有两种方法可以解决这个问题:
两种方式都是正确的,这取决于具体情况。也许第二种方式更接近于模式,但它取决于。
答案 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)
}
}