Мое приложение использует основные данные, в которых хранятся экземпляры пользовательского класса 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>
?