我正在尝试在Date值为nil的核心数据中创建新行:
@ObservedObject var mealsController = CoreDataController()
...
Button(action: {
self.mealsController.createEntry(meal_type: "Test", status: "notSet", will_eat: nil, eaten: nil)
}) {
Image(systemName: "text.badge.plus")
}
但是当我尝试这样做时,出现错误:'nil' is not compatible with expected argument type 'Date'
如何在那里定义该值为nil?我需要以nil的形式将其传递给我的控制器,因为我正在以文本形式读取它,因此在设置它之前,我不希望它具有任何值。
更新: 这是它在另一个类上引用的create条目,基本上是同一件事:
// Create
func createEntry(meal_type: String, status: String, will_eat: Date, eaten: Date) {
_ = Meals(id: UUID(), meal_type: meal_type, status: status, eaten: eaten, will_eat: will_eat)
saveToPersistentStore()
}
然后将其保存到Core Data中,例如:
func saveToPersistentStore() {
let moc = CoreDataStack.shared.mainContext
do {
try moc.save()
getMeals()
} catch {
NSLog("Error saving managed object context: \(error)")
}
}
答案 0 :(得分:0)
我不知道您的createEntry代码,但是可以使用“?”在CoreData或createEntry函数中将日期设置为可选。在声明它们时:
class YourCoreDataEntity: NSManagedObject,Identifiable {
@NSManaged var name:String
@NSManaged var status:String
@NSManaged var date1:Date?
@NSManaged var date2:Date?
}
答案 1 :(得分:0)
编辑:如果您实际上要求dates
不能为空且必须包含一个值,则可以使用诸如.distantFuture
或.distantPast
之类的默认值。这将为以后更改值提供更大的灵活性。这是代码:
self.mealsController.createEntry(meal_type: "Test", status: "notSet", will_eat: .distantFuture, eaten: .distantPast)
您需要更新createEntry
函数,以使其接受Date?
和will_eat
的可选eaten
参数,如下所示:
func createEntry(meal_type: String, status: String, will_eat: Date?, eaten: Date?) {
_ = Meals(id: UUID(), meal_type: meal_type, status: status, eaten: eaten, will_eat: will_eat)
saveToPersistentStore()
}
注意:您可能还需要根据需要对模型进行较小的更改。
替代方法:您可以将日期都设置为Date()
,也可以在显示位置检查两个日期是否都是equal
而不是将它们都检查为nil
。这是一些代码:
Button(action: {
let now = Date()
self.mealsController.createEntry(meal_type: "Test", status: "notSet", will_eat: now, eaten: now)
}) {
Image(systemName: "text.badge.plus")
}
// And at the place of displaying
Text(meal.will_eat == meal.eaten ? "Date is not set." : "Date is set.")
答案 2 :(得分:0)
您必须使用CoreData上下文创建对象。
//assign the context to the object
let meal = Meals(context: self.moc)
meal.id = UUID()
....
meal.will_eat = nil // or just remove that line
saveToPersistentStore()
我指的是另一个函数中声明的moc。
let moc = CoreDataStack.shared.mainContext