Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS MVP数据转换责任_Ios_Swift_Architecture_Mvp - Fatal编程技术网

iOS MVP数据转换责任

iOS MVP数据转换责任,ios,swift,architecture,mvp,Ios,Swift,Architecture,Mvp,假设我有一个带有Date属性的类 class SomeModel { ..some properties let date: Date = Date(timeIntervalSince1970: 1505050) ..more properties } 我需要使用这个转换(或者任何其他的,仅仅是示例)来显示它 使用模型视图演示器模式,如果我将SomeModel传递到视图并在那里执行转换,由于其他属性是String/Int,并且很容易显示它们,那么什么更容易呢。或者我应该

假设我有一个带有
Date
属性的类

class SomeModel {
    ..some properties
    let date: Date = Date(timeIntervalSince1970: 1505050)
    ..more properties
}
我需要使用这个转换(或者任何其他的,仅仅是示例)来显示它

使用模型视图演示器模式,如果我将
SomeModel
传递到
视图
并在那里执行转换,由于其他属性是
String
/
Int
,并且很容易显示它们,那么什么更容易呢。或者我应该为每个
SomeModel
字段创建属性吗

var someText: String {
    return model.someText
}

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

..other properties
然后调用
updateUI
like

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

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

视图不应该对数据的任何转换和操作负责。 有两种可能的方法可以克服此问题:

  • 在模型中创建计算属性或方法,并在视图中使用它们。我更喜欢计算属性,因为代码更清晰易懂
  • 管理Presenter类中的所有转换和操作。在MVP模式中,这个类的目的是获取模型,做一些工作,并将最终数据传递给视图
  • 这两种方法都是正确的,这取决于上下文。也许第二种方法更接近于模式,但这取决于具体情况

    有关计算属性的某些文档:
    视图不应对数据的任何转换和操作负责。 有两种可能的方法可以克服此问题:

  • 在模型中创建计算属性或方法,并在视图中使用它们。我更喜欢计算属性,因为代码更清晰易懂
  • 管理Presenter类中的所有转换和操作。在MVP模式中,这个类的目的是获取模型,做一些工作,并将最终数据传递给视图
  • 这两种方法都是正确的,这取决于上下文。也许第二种方法更接近于模式,但这取决于具体情况

    有关计算属性的某些文档:

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

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

    extension String {
    
       init(from date: Date) {
           // custom logic goes here
       }
    }
    
    然后,在您的相关演示者中,只有一个属性调用此扩展类来执行数据操作,这样其他演示者也可以使用此逻辑,例如

    public class Presenter {
    
        public var customProperty: String {
    
           return String.init(from: model.date)        
        }
    }
    

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

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

    extension String {
    
       init(from date: Date) {
           // custom logic goes here
       }
    }
    
    然后,在您的相关演示者中,只有一个属性调用此扩展类来执行数据操作,这样其他演示者也可以使用此逻辑,例如

    public class Presenter {
    
        public var customProperty: String {
    
           return String.init(from: model.date)        
        }
    }
    

    因此,您传递的模型有两个属性
    date:date
    stringDate:String{return”“}
    ?是的,正确的方法是在模型中有一个私有变量(您的日期)以及用于访问或修改来自外部类的值的所有公共计算属性。因此,您传递具有两个属性的模型
    date:date
    stringDate:String{return”“}
    ?是的,正确的方法是在模型中包含一个私有变量(您的日期)以及所有用于从外部类访问或修改值的公共计算属性。