将 NSDate 转换为日期
Convert NSDate to Date
这可能是个愚蠢的问题,但我找不到相关信息。我在我的应用程序中使用 CoreData,并保存了一个结构数组。问题是当我获取并尝试将其恢复到结构数组中时,我的 Date 变量有问题;我找不到将它从 NSDate 转换为 Date 的方法,我尝试使用 as Date
,但它让我感到沮丧,我不确定它是否安全。这是正确的吗?或者还有其他方法吗?
这是我的结构:
struct MyData {
var value = Int()
var date = Date()
var take = Int()
var commnt = String()
}
这就是我获取数据的方式:
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: { [=11=].date.compare(.date) == .orderedAscending})
return orderArray
}
这就是我设置 CoreDataClass 属性的方式:
@NSManaged public var commnt: String?
@NSManaged public var date: NSDate?
@NSManaged public var value: Int16
@NSManaged public var take: Int16
result.date
是一个 optional NSDate
,所以你可以桥接它
到一个可选的 Date
:
result.date as Date?
然后使用可选绑定来安全地解包它。在你的情况下
可能是
guard let date = result.date as Date? else {
// date is nil, ignore this entry:
continue
}
您可能还想替换
let commnt = String(describing: result.commnt)
和
guard let commnt = result.commnt else {
// commnt is nil, ignore this entry:
continue
}
否则你会得到像 Optional(My comment)
.
这样的注释字符串
(经验法则: String(describing: ...)
几乎从来不是你想要的
想要,即使编译器建议它编译代码。)
只需像这样进行隐式转换:
let nsdate = NSDate()
let date = nsdate as Date
您可以使用函数或仅使用扩展:
let nsDate = NSDate()
let date = Date(timeIntervalSinceReferenceDate: nsDate.timeIntervalSinceReferenceDate)
这可能是个愚蠢的问题,但我找不到相关信息。我在我的应用程序中使用 CoreData,并保存了一个结构数组。问题是当我获取并尝试将其恢复到结构数组中时,我的 Date 变量有问题;我找不到将它从 NSDate 转换为 Date 的方法,我尝试使用 as Date
,但它让我感到沮丧,我不确定它是否安全。这是正确的吗?或者还有其他方法吗?
这是我的结构:
struct MyData {
var value = Int()
var date = Date()
var take = Int()
var commnt = String()
}
这就是我获取数据的方式:
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: { [=11=].date.compare(.date) == .orderedAscending})
return orderArray
}
这就是我设置 CoreDataClass 属性的方式:
@NSManaged public var commnt: String?
@NSManaged public var date: NSDate?
@NSManaged public var value: Int16
@NSManaged public var take: Int16
result.date
是一个 optional NSDate
,所以你可以桥接它
到一个可选的 Date
:
result.date as Date?
然后使用可选绑定来安全地解包它。在你的情况下 可能是
guard let date = result.date as Date? else {
// date is nil, ignore this entry:
continue
}
您可能还想替换
let commnt = String(describing: result.commnt)
和
guard let commnt = result.commnt else {
// commnt is nil, ignore this entry:
continue
}
否则你会得到像 Optional(My comment)
.
(经验法则: String(describing: ...)
几乎从来不是你想要的
想要,即使编译器建议它编译代码。)
只需像这样进行隐式转换:
let nsdate = NSDate()
let date = nsdate as Date
您可以使用函数或仅使用扩展:
let nsDate = NSDate()
let date = Date(timeIntervalSinceReferenceDate: nsDate.timeIntervalSinceReferenceDate)