EKEvent 结束日期为零;无法在不使应用程序崩溃的情况下检查隐式解包可选

EKEvent endDate is nil; unable to check implicit unwrapped optional without crashing the app

在我的代码中,我从 EKEventstore 检索事件,然后将值映射到自定义 Swift 对象

public class WPEvent: NSObject, NSCopying, Comparable {

let ddLogLevel = DDLogLevel.verbose

static let vacationPrefix = "Vacation"
static let visitReportPrefix = "* "

public var eventIdentifier: String
public var calendar: EKCalendar
public var title: String
public var allDay: Bool
public var detached: Bool
public var unsafed: Bool
public var creationDate: Date?
public var startDate: Date
public var endDate: Date
public var timeZone: TimeZone?
public var location: String?

public init(event: EKEvent) {
    eventIdentifier = event.eventIdentifier
    calendar = event.calendar
    title = event.title
    allDay = event.isAllDay
    detached = event.isDetached
    unsafed = event.isNew
    creationDate = event.creationDate
    startDate = event.startDate
    endDate = event.endDate
    timeZone = event.timeZone
    location = event.location

    super.init()
}

在我所有的测试中,这都通过了并且没问题。但是最近我开始收到一些像这样的奇怪的崩溃报告

Hardware Model:      iPad5,4
OS Version:          iOS 10.2.1 (14D27)
Report Version:      105

Exception Type:  SIGTRAP
Exception Subtype: undefined

Thread 12 name:
Thread 12 Crashed:
0   libswiftFoundation.dylib         0x000000010295179c 0x102948000 + 38812
1   CalendarSyncEngine               0x0000000101399520 specialized WPEvent.init(event:) (WPEvent.swift:49)
2   CalendarSyncEngine               0x00000001013844b8 specialized EKEventStoreWrapper.events(withStart:end:salesRepId:) (EventStore.swift:0)
3   CalendarSyncEngine               0x00000001013846fc specialized EKEventStoreWrapper.events(forDate:salesRepId:) (EventStore.swift:0)

第 49 行是分配 endDate 的地方,如果它崩溃了,那么它总是在那里。

即使 EventKit API 将其列为隐式解包可选,是否有可能获得 nil-Enddate?

显然是的(感谢评论)

由于这个值是从 Apple 框架中提供的,我如何检查它是否为 nil 而不会在此时发生崩溃?

更新: 正如 AppleDoc“@discussion 在您设置它之前,对于新事件这将是零”中所述,复制非常简单。 所以根本不设置它,但我仍然无法弄清楚如何在不崩溃的情况下检查此事件是否没有结束日期。

我最后在我的 Swift 框架中添加了一小段 Objective-C 代码来检查 nil 并用一些值填充日期以避免崩溃