ios - 将 NSDate 和 double 保存到实体 (CoreData)

标签 ios swift core-data

我可以只使用字符串让它正常工作,但如果我尝试使用 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/

相关文章:

javascript - 在后台运行phonegap ios应用程序中的JavaScript函数。

ios - Jenkins/faSTLane - 没有找到本地代码签名身份

swift - 如何在 watchOS 中获取接口(interface) Controller 的实时实例?

ios 核心数据 - 将实体记录复制到另一个实体

ios - 如何在 Swift 4 中使用 FetchedResultsController 获取 DateSectionTitles

ios - 发送测试员 iOS 应用程序

ios - 无法摆脱致命异常 : NSInternalInconsistencyException Error

ios - 十六进制(长字符串)l 到二进制

ios - X 天后删除核心数据

ios - 在 Core Data 中同时保存上下文在 iOS7 中不起作用