Swift 4 – 无法指定“NSDate”类型的值来键入“Date?” 仅适用于物理设备

我已经看到了与此错误相关的其他问题,但我没有看到有人提到我目前遇到的问题。 请注意,在转换为Swift 4之前,我对此代码没有任何问题。

以下是有问题的代码:

let verseNotification = NSManagedObject(entity: entity, insertInto: self.managedObjectContext) as! VerseNotification verseNotification.date_scheduled = NSDate(timeIntervalSinceNow: finalTimeToScheduleSinceNow) 

请注意,属性date_scheduled的类型为Date

 @NSManaged public var date_scheduled: Date? 

当我构建我的应用程序以在我的物理iPhone(iPhone 7)上的DEBUG中部署时,我收到以下错误(从Swift 3转换为Swift 4之后):

 Cannot assign value of type 'NSDate' to type 'Date?' - Insert 'as Date' 

正如它所说的那样解决问题…所以,现在我的代码是这样的:

 verseNotification.date_scheduled = NSDate(timeIntervalSinceNow: finalTimeToScheduleSinceNow) as Date 

…直到我将目标切换到模拟器。 当我将目标切换为Simulator iPhone 7设备时,我现在收到以下错误:

 'NSDate' is not implicitly convertible to 'Date'; did you mean to use 'as' to explicitly convert? 

关于这个错误的混淆是,正如你在上面看到的那样,我明确地转换为类型Date 。 具有讽刺意味的是,我能够为模拟器iPhone 7消除此错误的唯一方法是删除我在第一步中添加的as Date

到底是怎么回事? 我错过了什么?

我担心为“通用设备”构建发布版本,不知道为什么我会收到冲突的错误。

更新我发现了一些新的,非常有趣的东西。

当我构建部署到我的物理iPhone 7设备时,生成的数据模型对象的Core Data定义date_scheduled属性创建为Date

但是,当我构建部署在Simulator iPhone 7上时,生成的数据模型对象的Core Date定义date_scheduled属性创建为NSDate。

这是Swift 4或Xcode 9中的新function吗? 从Swift 3转换到Swift 4后,我有没有新的设置?

这是Xcode的错误。 请报告或打开雷达,以便在将来的版本中修复

这是我如何解决这个问题(Xcode 9.2,Swift 4.0,watchOS 4):

 #if arch(i386) //watchOS Simulator needs this completionDate = newValue as NSDate? #else //watchOS device needs this completionDate = newValue #endif 

在我的情况下,我在iOS和watchOS目标之间共享代码,所以它看起来像这样:

 #if os(watchOS) #if arch(i386) //watchOS Simulator needs this completionDate = newValue as NSDate? #else //watchOS device needs this completionDate = newValue #endif #else //iOS, simulator or device completionDate = newValue #endif 

在上面,completionDate是我的核心数据日期属性,newValue是Swift“日期?” 值。