Swift 用nil初始化CoreData日期

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

我正在尝试在核心数据中创建日期值为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'与预期的参数类型'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,所以我添加了另一种方法