NSManagedObject 的日期与 NSDate 的 Xcode 9 构建问题

Posted

技术标签:

【中文标题】NSManagedObject 的日期与 NSDate 的 Xcode 9 构建问题【英文标题】:Xcode 9 build issue with Date vs NSDate for NSManagedObject 【发布时间】:2018-03-04 09:04:54 【问题描述】:

Xcode 9 为模拟器与设备中实体的Date 类型属性生成不同的代码。我在 coredata 中将 Class 下的 codegen 功能设置为 category/extension

直到 Xcode 8.3(最新)它都运行良好(NSDate 总是)。下面是 Xcode 9 (Swift 4) 的 自动生成代码 属性 -

在设备上:-

@NSManaged public var requiredDate: Date?

与,

在模拟器上:-

@NSManaged public var requiredDate: NSDate?

有人遇到过这个问题吗?对于一个有 50 多个成员的项目,在 Xcode 更新修复它之前修复这个问题的最佳解决方案是什么(我希望有一个苹果雷达)?

【问题讨论】:

实际上即使在 Swift 3 中,推荐的类(结构)也是 Date 我假设您只是在评论您的观察,而不是建议或询问任何内容。请注意,我上面粘贴的代码是由 Xcode 自动生成,因为 codegen 设置不是“手动/无”。更新了我的问题语言,使其更加清晰。 我在暗示编译器并不完美,不要盲目相信它。例如,即使您将 Core Data 属性声明为非可选,编译器也会生成可选属性,并且编译器会为任何数字类型生成 NSNumber,尽管 Swift IntDoubleBool 也完全有效. 是的,没错。我不知道解决此问题的最佳方法是什么。不想使用“手动/无”设置。而且,如果我在设备和模拟器上使用 #if 宏并以不同方式处理此属性,那么我担心 Xcode 何时会在更新中修复此问题,然后整个团队 + 自动化服务器几乎需要同时更新 Xcode。将其视为主要的 Xcode 更新。不是一个好的解决方案。 本期存在一些随机性。突然,问题自动消失了,codegen 在模拟器和设备上都选择了日期。 【参考方案1】:

让我自己回答这个问题。这些是我的观察(到目前为止)和潜在的解决方案。

这个问题似乎随机。突然,问题消失了,codegen 终于在模拟器和设备上解决了Date

但是,我应用了基于宏的解决方案(现在不再需要)来解决它 -

// Workaround for Xcode 9 bug. The autogenerated code for 'Date' type attribute is NSDate vs Date based on device vs simualtor.

// This macro condition should be removed once an Xcode update fixes this issue
#if (arch(i386) || arch(x86_64))    // Simulator
    requiredDate <- (map["requiredDate"], NSDateTransform())    // milliseconds to NSDate
#else   // Device
    requiredDate <- (map["requiredDate"], DateTransform())    // milliseconds to Date
#endif

PS:我记得我至少在 iPhone SE Simulator、iPhone 7 设备上测试过它

【讨论】:

请将此报告给 Apple 的错误报告者:bugreport.apple.com 正如我在回答中所说的,这个问题非常随机。我在 Xcode 9.0 之后的现有项目中遇到了这个问题。我应用了这个答案中提到的解决方法,然后一天都很好。然后突然之间,编译器再次抱怨(构建错误),所以我最终删除了解决方法,全部使用Date。之后再也没有看到这个问题。 是的,我们会把这段代码放在哪里,@Ashok?谢谢。这个问题完全荒谬。 3个月了,还没有解决。 我也有这个问题,但它并没有神奇地消失。我已经向 Apple 提交了一个错误。 我在使用 XCode 9.2 (9C40b) 时遇到了这个问题,但最终只需要运行 Clean 来删除所有生成的旧代码。

以上是关于NSManagedObject 的日期与 NSDate 的 Xcode 9 构建问题的主要内容,如果未能解决你的问题,请参考以下文章

iOS NSDate 和 NSManagedObject

作为获取谓词的日期范围 - 核心数据之间的 NSDate 谓词

根据今天的日期检查 CoreData

核心数据 - 遍历 NSManagedObject 的属性

objective-c calendar 日历

如何在目标c中获得该月的第n个星期日日期?