Инициализировать дату CoreData с помощью nil - PullRequest
1 голос
/ 25 мая 2020

Я пытаюсь создать новую строку в основных данных со значениями 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, потому что я читаю его в тексте, поэтому, пока он не будет установлен, я не хочу, чтобы он имел значение.

UPDATE: это запись создания, которая относится к другому классу, это в основном то же самое:

// 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)")
        }
    }

Ответы [ 3 ]

0 голосов
/ 25 мая 2020

Изменить: если вам действительно требуется, чтобы 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.")
0 голосов
/ 25 мая 2020

Вы должны создавать свои объекты в контексте 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()

Я имею в виду ваш mo c, объявленный в другой функции ..

let moc = CoreDataStack.shared.mainContext
0 голосов
/ 25 мая 2020

Я не знаю ваш код createEntry, но задайте даты как необязательные в CoreData или в функции createEntry, используя "?" при их объявлении:

class YourCoreDataEntity: NSManagedObject,Identifiable {
    @NSManaged var name:String
    @NSManaged var status:String
    @NSManaged var date1:Date?
    @NSManaged var date2:Date?
}
...