Swift 用nil初始化CoreData日期
我正在尝试在核心数据中创建日期值为nil的新行:Swift 用nil初始化CoreData日期,swift,core-data,swiftui,Swift,Core Data,Swiftui,我正在尝试在核心数据中创建日期值为nil的新行: @ObservedObject var mealsController = CoreDataController() ... Button(action: { self.mealsController.createEntry(meal_type: "Test", status: "notSet", will_eat: nil, eaten: nil) }) { Image(systemName: "text.badge.plu
@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'与预期的参数类型'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()
}
然后我将其保存到核心数据中,如:
func saveToPersistentStore() {
let moc = CoreDataStack.shared.mainContext
do {
try moc.save()
getMeals()
} catch {
NSLog("Error saving managed object context: \(error)")
}
}
我不知道您的createEntry代码,但在声明日期时使用“?”将日期设置为CoreData中的可选日期或createEntry函数:
class YourCoreDataEntity: NSManagedObject,Identifiable {
@NSManaged var name:String
@NSManaged var status:String
@NSManaged var date1:Date?
@NSManaged var date2:Date?
}
我不知道您的createEntry代码,但在声明日期时使用“?”将日期设置为CoreData中的可选日期或createEntry函数:
class YourCoreDataEntity: NSManagedObject,Identifiable {
@NSManaged var name:String
@NSManaged var status:String
@NSManaged var date1:Date?
@NSManaged var date2:Date?
}
编辑:如果您实际要求日期不能为空,并且必须包含一个值,则可以使用默认值,如
.distantFuture
或.distantpass
。这将为以后更改值提供更大的灵活性。代码如下:
self.mealsController.createEntry(meal_type: "Test", status: "notSet", will_eat: .distantFuture, eaten: .distantPast)
您需要更新createEntry
函数,使其接受可选的Date?
参数,用于will\u eat
和eat
,如下所示:
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()
,并在显示位置检查两个日期是否相等,而不是检查它们是否为nil
。下面是一些代码:
按钮(操作:{
让我们现在=日期()
self.mealsController.createEntry(膳食类型:“测试”,状态:“未设置”,将吃:现在,吃:现在)
}) {
图像(系统名称:“text.badge.plus”)
}
//在展示的地方
Text(mean.will_eat==mean.eat?“日期未设置。”:“日期已设置。”)
编辑:如果您确实要求日期不能为空,并且必须包含一个值,则可以使用默认值,如.distantFuture
或.distantpass
。这将为以后更改值提供更大的灵活性。代码如下:
self.mealsController.createEntry(meal_type: "Test", status: "notSet", will_eat: .distantFuture, eaten: .distantPast)
您需要更新createEntry
函数,使其接受可选的Date?
参数,用于will\u eat
和eat
,如下所示:
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()
,并在显示位置检查两个日期是否相等,而不是检查它们是否为nil
。下面是一些代码:
按钮(操作:{
让我们现在=日期()
self.mealsController.createEntry(膳食类型:“测试”,状态:“未设置”,将吃:现在,吃:现在)
}) {
图像(系统名称:“text.badge.plus”)
}
//在展示的地方
Text(mean.will_eat==mean.eat?“日期未设置。”:“日期已设置。”)
您必须使用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
您必须使用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
张贴createEntry
@Frankenstein I的代码,更新代码使其更加明确,这有帮助吗?我认为主要是初始化核心数据对象的问题,对吗?为什么需要直接保存它,跳过它,错误就会消失。然后在控制器类中处理最终的验证错误。或者等到你有了所有的数据后再创建你的对象。是的,这可能是一种方法,我只是尝试重用相同的函数,而不是创建一个新的函数。仍然存在疑问。。。如何将其设置为nil lol@Frankenstein@Spyky好的,你可以把模型贴出来吗。还要检查答案是否有帮助。发布createEntry
@Frankenstein I的代码,更新代码使其更明确,这有帮助吗?我认为主要是初始化核心数据对象的问题,对吗?为什么需要直接保存它,跳过它,错误就会消失。然后在控制器类中处理最终的验证错误。或者等到你有了所有的数据后再创建你的对象。是的,这可能是一种方法,我只是尝试重用相同的函数,而不是创建一个新的函数。仍然存在疑问。。。如何将其设置为nil lol@Frankenstein@Spyky好的,你可以把模型贴出来吗。还要检查答案是否有用。这会抱怨可选类型“Date”的值必须解包为类型“Date”的值,并将其解包。问题是核心数据似乎不接受Date上的零值,这意味着。。。这是可行的,但我想要的不是零。问题是,我在UI中显示这个日期,如果它为零,它将不会显示,如果它包含一个日期,它会显示。这就是为什么我需要它,因为我已经给了你一个工作机会。由于您的模型不接受可选选项,因此只能通过变通解决。您可能希望在检查日期是否已设置时进行修改。也许在你的模型中添加一个布尔值isDateSet
@Spyky Ok,所以我在我的答案中添加了一个替代方法代码。这会抱怨可选类型“Date”的值必须被解包为类型“Date”的值,并且解包。问题是核心数据似乎不接受Date上的零值,这意味着。。。这是可行的,但我想要的不是零。问题是,我在UI中显示这个日期,如果它为零,它将不会显示,如果它包含一个日期,它会显示。这就是为什么我需要它,因为我已经给了你一个工作机会。由于您的模型不接受可选选项,因此只能通过变通解决。您可能希望在检查日期是否已设置时进行修改。也许可以在模型中添加一个布尔值isDateSet
@Spyky Ok,所以我添加了另一种方法