【发布时间】:2015-08-12 20:45:00
【问题描述】:
Person 类的 init 方法如下所示
init (id:int64, firstName:String, lastName:String, birthDay:NSDate?)
如您所见,birthDay 是可选的,因为我们并不总是有生日。
数据来自 SQLite 数据库。 SQLite 中不存在日期类型,因此日期表示为字符串(可以为 NULL)。为了将该字符串转换为 NSDate,我为 NSDate 创建了一个扩展:
extension NSDate: Value {
public class var declaredDatatype: String {
return String.declaredDatatype
}
public class func fromDatatypeValue(stringValue: String) -> NSDate {
return SQLDateFormatter.dateFromString(stringValue)!
}
public var datatypeValue: String {
return SQLDateFormatter.stringFromDate(self)
}
}
所以在创建人的时候:
let person = Person(id: row[id], firstName: row[first_name], lastName: row[last_name], birthDay:NSDate.fromDatatypeValue(row[birthday]!))
如果生日字符串为 NULL,将失败。 (我必须解开行[生日]!正如预期的非可选字符串,这可能/不能更改)
所以我的想法是在创建人之前对此进行测试
var birthday : NSDate
if let birthdayString = row[Person.birthday] {
birthday = NSDate.fromDatatypeValue(birthdayString)
} else {
birthday=nil
}
以及在init函数中使用生日。
但 swift 告诉我:无法将“nil”类型的值分配给“NSDate”的值
如何解决?
PS。 :我知道我可以有一个 if 和 2 个初始化器,但我宁愿没有,因为我的 Person init func 有 12 个参数(为简单起见,我只使用了上面的 4 个)并且维护这是一个皮塔
【问题讨论】: