Какие типы Swift могут быть представлены в Objective-C?

Я создаю подкласс NSManagedObject в Swift, и я получаю сообщение об ошибке, когда я делаю свойство Optional, которое имеет тип Int, Float или Double (и, возможно, другие, которые я не пробовал).

@NSManaged var number: Float? //error:Property cannot be marked @NSManaged because its type cannot be represented in Objective-C
@NSManaged var anotherNumber: Float //no error
@NSManaged var array: NSArray? //no error
@NSManaged var anotherArray: Array<String>? //no error

Какие дополнительные типы могут быть представлены в Objective-C? Почему ошибка не появляется, когда я использую Swift Array или String (и когда я не использую опциональный Int или Double)?

Ответ 1

Вы не можете назначать произвольные типы свойствам Core Data, потому что методы доступа создаются динамически во время выполнения. Если вы создаете Objective-C подкласса управляемых объектов в Xcode, то вы увидите правильные типы данных, используемые по основным данным, например

  • NSNumber для атрибутов Boolean, Integer, Float и Double,
  • NSString для атрибутов String,
  • NSSet для отношений (неупорядоченные) ко многим.

Вы должны выбрать один и тот же тип данных в Swift.

Теоретически, скалярные аксессоры для примитивных типов данных также должны работать, но, похоже, проблема в текущей версии Swift, сравните Как использовать Core Data Integer 64 с Swift Int64? или Ошибка EXC_BAD_ACCESS при попытке изменить свойство Bool.