Небольшой контекст: мы используем CoreData и имеем классы FolderEntity
и AlbumEntity
, которые являются подклассами NodeEntity
. Если компилировать наш код для отладки или освободить ж/весь модуль оптимизации OFF вещи работают, как и ожидалось:Ошибка всего модуля оптимизации и полиморфизма
// fetch an entity from coreData, in this case it is a FolderEntity
// but reference it generically as a NodeEntity
if let node = context.optionalExistingObjectWithID(currentNodeID) as? NodeEntity {
print(node); // correctly says its a FolderEntity
print(node.contentTypes()); // correctly calls FolderEntity.contentTypes()
if let folder = node as? FolderEntity {
print(folder.contentTypes()); // correctly calls FolderEntity.contentTypes()
}
Вещи также работать, как ожидалось ранее, если я перехожу ON весь модуль оптимизации и компиляции для отладки , Но если я перехожу ON всего модуль оптимизации и компиляции для выпуска полиморфизм идет наперекосяк
// fetch an entity from coreData, in this case it is a FolderEntity
// but reference it generically as a NodeEntity
if let node = context.optionalExistingObjectWithID(currentNodeID) as? NodeEntity {
print(node); // correctly says its a FolderEntity
print(node.contentTypes()); // incorrectly calls the superclass' NodeEntity.contentTypes()
if let folder = node as? FolderEntity {
print(folder.contentTypes()); // correctly calls FolderEntity.contentTypes()
}
NodeEntity
(суперкласс) определяет ContentTypes(), как
func contentTypes() -> [SMContentType] {
return [];
}
FolderEntity
(подкласс) определяет ContentTypes() как
override func contentTypes() -> [SMContentType] {
return [ SMContentType.Folder, SMContentType.Album ];
}
Почему WM O беспорядок наследование, как это?
«Почему» не является реальным вопросом. Какой ответ вам понравится? Поведение, которое отличается для сборки Release, является ошибкой. Сохраните файл и перейдите к нему. – matt
«Если вы включите ВМО, он делает предположения X, поэтому вам нужно построить свои классы с учетом Y и Z» было бы замечательно – Shizam
Ну нет таких «предположений». Поведение, которое отличается для сборки Release, является ошибкой. Думаю, я уже это сказал. И Apple хочет знать об этом. Скажи им. – matt