将NSDate转换为Date

Enr*_*que 7 core-data nsdate swift

这可能是一个愚蠢的问题,但我找不到这些信息.我在我的应用程序中使用CoreData,并保存了一组结构.问题是当我获取并尝试将其恢复到struct数组中时,我的Date变量出现问题; 我找不到一种方法将它从NSDate转换为Date,我尝试使用as Date,但它让我强迫低调,我不确定它是否安全.这是对的吗?还是有另一种方式?

这是我的Struc:

struct MyData {
        var value = Int()
        var date = Date()
        var take = Int()
        var commnt = String()
    }
Run Code Online (Sandbox Code Playgroud)

这就是我抓取数据的方式:

func fetchRequestInfo() -> [MyData] {

        let fetchRequest: NSFetchRequest<GlucoseEvents> = GlucoseEvents.fetchRequest()

        do {
            let searchResults = try DatabaseController.getContext().fetch(fetchRequest)

            for result in searchResults as [GlucoseEvents] {
               let value = Int(result.value)
               let date = result.date as Date
               let take = Int(result.take)
               let commnt = String(describing: result.commnt)
                let data = MyData(value: value, date: date, take: take, commnt: commnt)
               self.dataArray.append(data)
                }



            } catch {

                print ("error: \(error)")

            }
        let orderArray = self.dataArray.sorted(by: { $0.date.compare($1.date) == .orderedAscending})
        return orderArray
    }
Run Code Online (Sandbox Code Playgroud)

这就是我如何设置CoreDataClass的属性:

@NSManaged public var commnt: String?
    @NSManaged public var date: NSDate?
    @NSManaged public var value: Int16
    @NSManaged public var take: Int16
Run Code Online (Sandbox Code Playgroud)

Mar*_*n R 11

result.date可选的 NSDate,因此您可以将其桥接到可选Date:

result.date as Date?
Run Code Online (Sandbox Code Playgroud)

然后使用可选绑定来安全地打开它.在你的情况下可能

guard let date = result.date as Date? else {
    // date is nil, ignore this entry:
    continue
}
Run Code Online (Sandbox Code Playgroud)

您可能还想要替换

let commnt = String(describing: result.commnt)
Run Code Online (Sandbox Code Playgroud)

guard let commnt = result.commnt else {
    // commnt is nil, ignore this entry:
    continue
}
Run Code Online (Sandbox Code Playgroud)

否则你会得到评论字符串Optional(My comment).

(经验法则: String(describing: ...)几乎不是你想要的,即使编译器建议它使代码编译.)


evy*_*vya 8

只需进行隐式转换即可:

let nsdate = NSDate() 
let date = nsdate as Date
Run Code Online (Sandbox Code Playgroud)