2016-08-18 4 views
2

Могу ли я переопределить быстрые пространства имен для модулей для классов NSCoding?Могу ли я переопределить быстродействующие пространства имен для модулей для классов NSCoding? (Мне нужен Module1.MyCodedClass == Module2.MyCodedClass)

я в основном нужно:

Module1.MyCodedClass == Module2.MyCodedClass 

Я знаю, что я могу поставить MyCodedClass в динамической рамки, и я использую этот подход, но это кажется излишним: D

возможно установить пользовательский модуль для определенный класс?


ИЛИ сказать NSCoder, что класс класс == б ...

+0

Возможно, я не понимаю. Зачем вам нужно одно и то же определение класса в двух отдельных рамках? Если они немного отличаются друг от друга, они не будут равны, и если они будут точно такими же, это дублирование кода. –

+0

приложение a и app b ... и, как я уже сказал, структура кажется излишней ... просто для того, чтобы получить одно и то же пространство имен. [apple discouragess слишком много ссылок слишком); –

+0

и я не хочу делиться кодом между a и b. должен существовать только общий «контракт» между разработчиками –

ответ

2

Если основной проблемой является NSCoding, я сделал это с атрибутом @objc() до объявления класса, как это :

@objc(MyCodedClass) class MyCodedClass: NSObject, NSCoding { 
... 
} 

Это вызывает NSCoder использовать только имя вашего класса без имени модуля присоединенной (так, что он будет делать, если класс были реализованы в Objective-C)

Al поэтому - вот что-то я только узнал, что полностью исправил проблему, с которой я столкнулся. У меня было пару версий моего приложения, прежде чем я выполнил вышеупомянутое исправление @objc() на моих закодированных классах, так что в основном есть кодированные версии Module1.MyCodedClass, которые плавают вокруг (хранятся в базе данных), и мне нужно было расшифровать их как просто MyCodedClass объектов сейчас. Вы можете сделать это в NSKeyedUnarchiver так:

[NSKeyedUnarchiver setClass:[MyCodedClass class] forClassName:@"Module1.MyCodedClass"]; 

До сих пор в моем тестировании она прекрасно работает ... до тех пор, пока вы установите класс для старого имени класса до когда-либо пытается декодировать объект, вы должны быть установленным. Всякий раз, когда вы пытаетесь декодировать объекты Module1.MyCodedClass, они будут декодировать их как объекты MyCodedClass.

+0

спасибо! thats @objc было это .. Я использовал setClass, но мне это не очень понравилось. хотя я согласен, что это действительно полезно в вашем случае! :) –