Проблема сборки Xcode 9 с датой и NSDate для NSManagedObject

Xcode 9 генерирует другой код для атрибута типа Date объекта в симуляторе и устройстве. У меня codegen функция под Class установлена ​​на category/extension в coredata.

До Xcode 8.3 (последний) все работало нормально (NSDate всегда). Ниже приведен автоматически сгенерированный код Xcode 9 (Swift 4) для атрибута -

На устройстве: -

@NSManaged public var requiredDate: Date?

А ТАКЖЕ,

В симуляторе: -

@NSManaged public var requiredDate: NSDate?

введите описание изображения здесь

Кто-нибудь сталкивался с этой проблемой? Какое лучшее решение для проекта с более чем 50 участниками, чтобы исправить это, пока обновление Xcode не исправит это (я надеюсь, что для этого есть радар Apple)?


person Ashok    schedule 22.09.2017    source источник
comment
На самом деле даже в Swift 3 рекомендуемый класс (структура) Date   -  person vadian    schedule 22.09.2017
comment
Я предполагаю, что вы просто комментируете свое наблюдение, а ничего не предлагаете и не спрашиваете. Обратите внимание, что код, который я вставил выше, автоматически сгенерирован Xcode, так как настройка генерации кода НЕ Вручную / Нет. Обновлен язык моих вопросов, чтобы он был более ясным.   -  person Ashok    schedule 22.09.2017
comment
Я предлагаю компилятор не идеален, не верьте ему слепо. Например, даже если вы объявляете атрибут Core Data как необязательный, компилятор независимо генерирует необязательные свойства, а компилятор генерирует NSNumber для любого числового типа, хотя Swift Int, Double, Bool тоже вполне допустим.   -  person vadian    schedule 22.09.2017
comment
Да, верно. Я не знаю, как лучше всего решить эту проблему. Не хочу использовать настройку Вручную / Нет. И, если я использую макрос #if и обрабатываю этот атрибут по-разному на устройстве и симуляторе, я беспокоюсь, когда Xcode исправит это в обновлении, тогда вся команда + серверы автоматизации нуждаются в обновлении Xcode почти одновременно. Считайте это крупным обновлением Xcode. Не лучшее решение.   -  person Ashok    schedule 22.09.2017
comment
В этом вопросе есть некоторая случайность. Внезапно проблема исчезла автоматически, и codegen установил дату как на симуляторе, так и на устройстве.   -  person Ashok    schedule 24.09.2017


Ответы (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.

person Ashok    schedule 24.09.2017
comment
Сообщите об этом репортеру Apple: bugreport.apple.com - person Tom Harrington; 26.09.2017
comment
Как сказано в моем ответе, эта проблема странно случайна. Я столкнулся с этой проблемой в нашем существующем проекте после Xcode 9.0. Я применил обходной путь, упомянутый в этом ответе, тогда все было хорошо в течение одного дня. Затем внезапно компилятор снова пожаловался (ошибка сборки), поэтому я удалил обходной путь, остановившись на Date для всех. Больше никогда не видел эту проблему. - person Ashok; 23.11.2017
comment
Да, где бы мы поместили этот код, @Ashok? Спасибо. Эта проблема в высшей степени нелепа. 3 месяца и все еще не исправлено. - person Dakine83; 18.12.2017
comment
У меня тоже есть эта проблема, но она не исчезла для меня волшебным образом. Я отправил сообщение об ошибке в Apple. - person Kenny Wyland; 23.01.2018
comment
Я столкнулся с этим с XCode 9.2 (9C40b), но в конечном итоге просто нужно было запустить Clean, чтобы избавиться от всего старого сгенерированного кода. - person superstator; 19.02.2018