NSDate 变量为 nil

NSDate variable as nil

Person class 的初始化方法看起来像

init (id:int64, firstName:String, lastName:String, birthDay:NSDate?)

如您所见,生日是可选的,因为我们并不总是有生日。

数据来自 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,将失败。 (我必须打开行[生日]!作为一个非可选字符串,并且这个may/can不会改变)

所以我的想法是在创建人之前对此进行测试

 var birthday : NSDate
            if let birthdayString = row[Person.birthday] {
                birthday = NSDate.fromDatatypeValue(birthdayString)
            } else {
                birthday=nil
            }

并在初始化函数中使用生日。

但是 swift 告诉我:无法将类型 'nil' 的值分配给 'NSDate'

的值

如何解决这个问题?

PS。 :我知道我可以有一个 if 和 2 个初始化器,但我宁愿没有,因为我的 Person init func 有 12 个参数(为了简单起见,我在上面只使用了 4 个)并且维护这是一个 pita

执行以下操作。

var birthday : NSDate? = nil
if let birthdayString = row[Person.birthday] {
    birthday = NSDate.fromDatatypeValue(birthdayString)
}