NSNull为具有NSDate类型属性的Struct

时间:2015-11-02 23:25:49

标签: swift

我有一个来自服务器的对象,被Swift 2.1识别为NSDate或NSNull。我想将它放入一个具有NSDate类型属性的结构中。 那可能吗?如果没有,我应该在以后使用它时如何处理这种类型?

    struct Data {
        var completedAt: [NSDate]
        var name: [String]
        var gender: [Bool]
    }

但有时完成来自服务器的NSNull:

completedAt = "<null>";

非常感谢任何帮助,谢谢。

2 个答案:

答案 0 :(得分:0)

根据我对问题中文本的解释,你并不意味着将变量声明为数组。

这就是我处理我的牧师的方式,我认为它的工作非常巧妙。 日期格式化程序可能不会在构造函数的每次迭代中启动。如果您不能定期使用该日期,您可能希望保持讨厌,直到您需要解析日期,或者您可以拥有一个仅实例化一次的静态日期格式化工具。

struct Data {
    var completedAt: NSDate?
    var name: String
    var gender: Bool

    init?(dictionary: [String:AnyObject]) {
        //Guessing that you want some of the values non optional...
        guard let name = dictionary["name"] as? String, 
              let gender = dictionary["gender"] as? String 
        else { 
            return nil 
        }

        self.name = name
        self.gender = gender

        let dateFormatter = NSDateFormatter()
        dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"

        //safe handle of optional values
        if let completedAtString = dictionary["completedAt"] as? String, completedAt = dateFormater.dateFromString(completedAtString) {
            self.completedAt = completedAt
        }
    }
}

答案 1 :(得分:0)

退后一步。对于服务器可能提供的每个项目,无法保证您收到预期的内容,因为您无法控制服务器。所以你需要决定如何对哪个输入做出反应。

例如,在期待日期的情况下(如果您的数据是JSON,这意味着您可能期望以某种方式格式化字符串),您收到的实际数据可能是数组,字典,字符串,数字,bool,null或什么也没有。然后,您可能会例如决定要将任何内容解释为null或将空字符串解释为nil,您希望将包含格式良好的日期的字符串解释为NSDate,以及调试版本中的任何其他致命错误,以及在发布版本中没有任何内容或致命错误。另一方面,如果绝对需要NSDate,那么您可能会解释任何不能将NSDate作为错误的内容。

然后你编写一个功能,提供你想要的东西并使用它。通过这种方式,您可以解析复杂的数据,当您的代码不应该是您的代码时,您的代码会警告您,并且您的代码要么在任何可能的输入中存活,要么故意在错误的输入上崩溃,如您所愿。