我可以只使用字符串让它正常工作,但如果我尝试使用 double 或 NSDates,则会出现错误:
“无法将类型“NSDate?”的值分配给类型“String?”
“无法将类型“Double?”的值分配给类型“String?”
@IBAction func save(_ sender: Any) {
if item != nil {
item?.startdate = startDate.text
item?.pickup = pickup.text
item?.miles = miles.text
item?.company = company.text
item?.destination = destination.text
item?.enddate = endDate.text
} else {
let entitydescription = NSEntityDescription.entity(forEntityName: "Entity", in: pc)
let item = Entity(entity: entitydescription!, insertInto: pc)
item.startdate = startDate.text
item.pickup = pickup.text
item.miles = miles.text
item.company = company.text
item.destination = destination.text
item.enddate = endDate.text
}
do {
try pc.save()
} catch {
print(error)
return
}
navigationController!.popViewController(animated: true)
}
这是每个字段的类型:
@NSManaged public var startdate: NSDate?
@NSManaged public var pickup: String?
@NSManaged public var miles: Double
@NSManaged public var company: String?
@NSManaged public var destination: String?
@NSManaged public var enddate: NSDate?
最佳答案
您需要将 miles.text、startdate.text 和 enddate.text 分别转换为 Double、NSDate 和 NSDate。
对于 startdate.text/enddate.text:
我不确定您在保存项目时为这些值设置了什么限制,但您应该使用默认值以防转换失败。对于此示例,假设日期格式为“5/15/17”,格式为 M/d/y
let defaultDate = NSDate() //current date
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "M/d/y"
if let startDateText = startdate.text, let startDate = dateFormatter.string(from: startDateText) as? NSDate {
item?.startdate = startDate
} else {
item?.startdate = defaultDate
}
if let endDateText = startdate.text, let endDate = dateFormatter.string(from: endDateText) as? NSDate {
item?.startdate = endDate
} else {
item?.startdate = defaultDate
}
对于英里.text:
相同的想法,根据 item.miles 的文本内容使用默认值以防转换失败
if let milesText = miles.text {
item?.miles = Double(miles.text) ?? 0.0 //default is 0.0
} else {
item?.miles = 0.0
}
或者简单的一行——
item?.miles = Double(miles.text ?? "0.0")
如果您有一个特定的默认值,只需在分配项目的属性之前声明它,
let defaultMilesStr = "0.432"
item?.miles = Double(miles.text ?? defaultMiles)
另外,提示一下,在赋值时不要将可选值包裹起来是个好习惯。因此,即使有检查以确保 item != nil,总体上最好还是使用“guard”或“if-let”安全地打开 item。由于您正在创建一个不存在的新项目,因此在这种情况下 id 与 if-let 一起使用:
if let item = item {
// assign values to item's prop's
// item.startdate = .....
} else if let entityDescription = NSEntityDescription.entity(forEntityName: "Entity", in: pc), let item = Entity(entity: entityDescription, insertInto: pc) {
// assign values to item's prop's
// item.startdate = .....
}
//further execution
关于ios - 将 NSDate 和 double 保存到实体 (CoreData),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43991963/