Безопасное кодирование Set <CustomObject> - PullRequest
0 голосов
/ 29 сентября 2019

Мое приложение использует основные данные, в которых хранятся экземпляры пользовательского класса CustomClass.
. Этот класс имеет ряд свойств, большинство из которых стандартных типов, но одно свойство имеет значение xxx: Set<CustomObject>.
. Таким образом, xcdatamodeld указывает (среди прочих со стандартными типами) атрибут xxx типа Transformable. xxx - это Set<CustomObject>. Его тип Optional, а Transformer теперь NSSecureUnarchiveFromData.
Ранее Transformer не был указан, поэтому декодирование не было безопасным. Но теперь Apple рекомендует использовать безопасное кодирование, поскольку в будущем небезопасное кодирование будет устаревшим.

Чтобы включить безопасное кодирование, я сделал следующее:
CustomClass теперь принимает NSSecureCoding вместо NSCoding.
Следующее var было добавлено к CustomClass:

public static var supportsSecureCoding: Bool { get { return true } }  

Затем я попытался изменить public required convenience init?(coder aDecoder: NSCoder) {…}, чтобы атрибут xxx был надежно декодирован. Я знаю, что вместо

let xxx = aDecoder.decodeObject(forKey: „xxx“) as? Set<CustomObject>  

я должен использовать сейчас decodeObject(of:forKey:), где of - это тип объекта, который нужно декодировать, здесь введите Set<CustomObject>.
Моя проблема в том, чтоЯ не знаю, как сформулировать это: если я использую

let xxx = aDecoder.decodeObject(of: Set<CustomObject>.self, forKey: „xxx“)  

, я получаю ошибку Cannot convert value of type 'Set<CustomObject>.Type' to expected argument type '[AnyClass]?' (aka 'Optional<Array<AnyObject.Type>>‘).
Видимо, компилятор не скомпилировал

func decodeObject<DecodedObjectType>(of cls: DecodedObjectType.Type, forKey key: String) -> DecodedObjectType? where DecodedObjectType : NSObject, DecodedObjectType : NSCoding  

, но вместо этого

func decodeObject(of classes: [AnyClass]?, forKey key: String) -> Any?

т.е. он рассматривал Set<CustomObject> не как один тип, а как набор типов.

Итак, как мне указать, что должен декодироваться только один тип, а именно Set<CustomObject>?

1 Ответ

0 голосов
/ 01 октября 2019

К сожалению, я не смог найти ничего в документации Apple, но я нашел подсказку к решению в этом сообщении :
NSSecureCoding недоступно для всехстандартные быстрые занятия. Для тех классов, которые его не поддерживают, нужно использовать классы-аналоги Objective-C, то есть NSString вместо String.

Один пример: если необходимо надежно кодировать var string = "String", необходимо использовать, например, aCoder.encode(string as NSString, forKey: „string“).

В настоящее время Set не поддерживается NSSecureCoding. Мне пришлось использовать таким образом

let aSet: Set<CustomObject> = []
aCoder.encode(aSet as NSSet, forKey: „aSet“)  

и

let decodedSet = aDecoder.decodeObject(of: NSSet.self, forKey: „aSet“) as? Set<CustomObject>
...