Person类的init方法看起来像
init (id:int64, firstName:String, lastName:String, birthDay:NSDate?)
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,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)
}
}
Run Code Online (Sandbox Code Playgroud)
所以在创建一个人时:
let person = Person(id: row[id], firstName: row[first_name], lastName: row[last_name], birthDay:NSDate.fromDatatypeValue(row[birthday]!))
Run Code Online (Sandbox Code Playgroud)
如果生日字符串为NULL,则会失败.(我必须解开行[birthday]!因为需要一个非可选的String,这可能/不能更改)
所以我的想法是在创建这个人之前对此进行测试
var birthday : NSDate
if let birthdayString = row[Person.birthday] {
birthday = NSDate.fromDatatypeValue(birthdayString)
} else {
birthday=nil
}
Run Code Online (Sandbox Code Playgroud)
并在init函数中使用birthday.
但是swift告诉我:不能将'nil'类型的值赋给'NSDate'的值
怎么解决这个问题?
PS.:我知道我可以有一个if和2初始化器,但我宁愿没有,因为我的Person init func有12个参数(为了简单起见,我只使用了4个以上)并保持这是一个皮塔饼
请执行下列操作.
var birthday : NSDate? = nil
if let birthdayString = row[Person.birthday] {
birthday = NSDate.fromDatatypeValue(birthdayString)
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5371 次 |
最近记录: |