ข้อผิดพลาด: อาร์กิวเมนต์ประเภท 'วันที่?' ไม่สอดคล้องกับประเภทที่คาดไว้ 'ReferenceConvertible'

ฉันได้รับข้อผิดพลาดใน Xcode:

อาร์กิวเมนต์ประเภท 'วันที่?' ไม่สอดคล้องกับประเภทที่คาดไว้ 'ReferenceConvertible'

ข้อผิดพลาดนี้หมายความว่าอย่างไร และจะแก้ไขได้อย่างไร?

ตัวอย่าง:

ฉันมีเอนทิตีใน Core Data ที่มีชื่อ ToDoItem (Codegen: Class Definition และ Module: Current Product Module) และตั้งค่า 2 คุณลักษณะ:

  1. createAt - ไม่ใช่ทางเลือก ค่าเริ่มต้น: วันที่ปัจจุบัน
  2. หัวเรื่อง - ไม่บังคับ ค่าเริ่มต้น: สตริงว่าง

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 โดยใช้ปุ่ม Delete ในแอปของฉัน แอปก็ขัดข้องในบรรทัดเดียวกันโดยมีข้อผิดพลาด:

หัวข้อที่ 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