NSNull转换为具有NSDate类型属性的Struct



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

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

但有时completedAt以NSNull的形式来自服务器:

completedAt = "<null>";

非常感谢您的帮助,谢谢。

根据我对问题中文本的解释,您无意将变量声明为数组。

这就是我如何处理我的牧师,我认为它相当巧妙。日期格式化程序可能不应该在构造函数的每次迭代中启动。如果你不经常使用日期,你可能想保持厌恶,直到你需要解析日期,或者你可以有一个只实例化一次的静态日期格式化程序实用程序。

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
        }
    }
}

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

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

然后,你可以编写一个函数来提供你想要的东西并使用它。这样,你就可以解析复杂的数据,当某个东西不正常时,你的代码会警告你,你的编码要么在任何可能的输入中幸存下来,要么故意在错误的输入中崩溃。

最新更新