当我从核心数据中获取记录时,我正在寻找abreak
是否为空或为零。以前运行我的应用程序时,系统提示我abreak
为零。要解决此问题,我想检查它是否为nil以及输出为0。
到目前为止,这是我的代码:
func fetchCards() {
guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
return
}
let managedContext = appDelegate.persistentContainer.viewContext
let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "Date")
let sort = NSSortDescriptor(key: #keyPath(Date.date), ascending: true)
fetchRequest.sortDescriptors = [sort]
do {
cards = try managedContext.fetch(fetchRequest)
for card in cards as [NSManagedObject] {
let time1 = card.value(forKey: "startTime") as! String
let time2 = card.value(forKey: "endTime") as! String
let abreak = card.value(forKey: "abreak") as! Int
var hours = ""
if abreak == nil {
self.breaks.append(0)
hours = calcTime(time1: time1, time2: time2)
} else {
self.breaks.append(card.value(forKey: "abreak") as! Int)
let time3 = Int(time2)! - abreak
hours = calcTime(time1: time1, time2: "\(time3)")
}
self.hours.append(hours)
}
} catch let error as NSError {
print("Could not fetch. \(error), \(error.userInfo)")
}
}
我遇到错误“将'Int'类型的非可选值与nil进行比较,总是返回false。”还有另一种解决方法吗?
答案 0 :(得分:0)
您可以使用guard let or if let
来代替time1,time2,abreak。
for card in cards as [NSManagedObject] {
guard let time1 = card.value(forKey: "startTime") else {return}
guard let time2 = card.value(forKey: "endTime") else {return}
guard let abreak = card.value(forKey: "abreak") else {return}
var hours = ""
if abreak == nil {
self.breaks.append(0)
hours = calcTime(time1: time1, time2: time2)
} else {
self.breaks.append(card.value(forKey: "abreak") as! Int)
let time3 = Int(time2)! - abreak
hours = calcTime(time1: time1, time2: "\(time3)")
}
self.hours.append(hours)
答案 1 :(得分:0)
如果abreak
可以是nil
,则必须有条件下放到Int
let abreak = card.value(forKey: "abreak") as? Int
或者写起来更方便
....
var hours = ""
if let abreak = card.value(forKey: "abreak") as? Int {
self.breaks.append(abreak)
let time3 = Int(time2)! - abreak
hours = calcTime(time1: time1, time2: "\(time3)")
} else {
self.breaks.append(0)
hours = calcTime(time1: time1, time2: time2)
}
....
基本上,强烈建议使用NSManagedObject
子类和点表示法,而不要使用原始的KVC方法。