Кодът, върху който работя сега (наследен от друг екип), има слой за постоянство, базиран на CoreData.
Един от обектите се нарича „Известие“ и представлява съобщения, периодично анкетирани от клиентското приложение от задния край (несвързано с APS); съответният подклас NSManagedObject се дефинира по следния начин:
import Foundation
import CoreData
@objc(Notification) public class Notification: NSManagedObject {
// etc...
Излишно е да казвам, че това име на клас засенчва едноименния тип Foundation (контрагент на NSNotification от страна на Objective-C). Приложението не използва техниката на NotificationCenter, така че досега не беше проблем.
Сега трябва да въведа известия за някои от моите класове, за да наблюдавам определени събития на ниво приложение и не искам да правя недвусмислие всеки път, напр.
let notification = Foundation.Notification.Name(...
Наясно съм, че не мога да променя имената на класовете на моите CoreData обекти, без да наруша съвместимостта, но си помислих, че @objc(Notification)
ще ми позволи да променя името на класа Swift; например:
@objc(Notification) public class AppNotification: NSManagedObject {
// ^ This stays the same ^ This changes
...в крайна сметка CoreData е Objective-C API. Логично е, че ако трябва изрично да посоча името на мостовия клас на Objective-C, може би ще мога да се измъкна с име на клас Swift, което е различно от модела.
Но не, приложението ми се срива, ако направя промяната по-горе.
Има ли начин да се заобиколи това, или съм останал с ужасното решение (и липсата на предвидливост) на първоначалния автор?
typealias
заFoundation.Notification
? - person Sweeper   schedule 06.08.2020@objc(Notification)
не пречи наFoundation.Notification
- референтният тип Obj-C еNSNotification
. Както и да е, можете да промените името на класа (вижте моя отговор) и той не трябва да се срива. Ако се срине, има някои други проблеми във вашата кодова база, които са били скрити досега (като някой е използвалclassName
, за да получи име на обект, ...). Или това може да е проблем с генерирането на код, стари извлечени данни, ... Включете проследяването на стека, за да можем да видим какво се случва. - person zrzka   schedule 06.08.2020