Ошибка: тип аргумента "Дата?" не соответствует ожидаемому типу ReferenceConvertible

Я получаю сообщение об ошибке в Xcode:

Тип аргумента "Дата?" не соответствует ожидаемому типу ReferenceConvertible

Что означает эта ошибка? А как исправить?

ПРИМЕР:

У меня есть объект в основных данных с именем ToDoItem (Codegen: определение класса и модуль: модуль текущего продукта) и установил 2 атрибута:

  1. createdAt - НЕ необязательно, значение по умолчанию: текущая дата
  2. title - НЕ необязательно, значение по умолчанию: пустая строка

Xcode автоматически сгенерировал для меня класс:

import Foundation
import CoreData


public class ToDoItem: NSManagedObject {

}

В ContentView у меня есть этот код, в котором я передаю todoItem в EditItemView:

ForEach(toDoItems, id: \.self) {todoItem in

    NavigationLink(destination: EditItemView(todoItem: todoItem)) {

        ToDoItemView(title: todoItem.title ?? "", createdAt: todoItem.createdAt ?? Date())
}

И в EditItemView я получаю сообщение об ошибке в этой строке:

Text("\(todoItem.createdAt, formatter: Self.dateFormat)")

Я могу устранить эту ошибку, если использую:

Text("\(todoItem.createdAt!, formatter: Self.dateFormat)")

Но ... даже сейчас нет ошибки при создании приложения, после того как я удалю todoItem с помощью кнопки Удалить в моем приложении, приложение вылетает в той же строке с ошибкой:

Поток 1: Неустранимая ошибка: неожиданно обнаружен ноль при разворачивании необязательного значения

Я только учусь и пока знаю, что это связано с тем, что некоторые значения являются необязательными в Swift, даже если они не являются необязательными в Core Data. И я прочитал это разворачивание необязательных значений с помощью! следует избегать в большинстве случаев. Но все же я не знаю, как решить эту проблему. Как использовать todoItem.createdAt, если todoItem.createdAt не работает и todoItem.createdAt! вылетает приложение.


person mallow    schedule 06.12.2019    source источник


Ответы (1)


Принудительное развертывание без каких-либо условий - это плохо, на самом деле теперь вы знаете, почему, старайтесь всегда этого избегать ...

Вот одно из возможных исправлений этого сбоя:

Text(todoItem.createdAt != nil ? "\(todoItem.createdAt!, formatter: Self.dateFormat)" : "")
person Asperi    schedule 06.12.2019