У меня есть подкласс NSDocument
, который содержит свойство типа NSAttributedString
(среди прочих).Чтобы включить постоянство, мне нужно переопределить следующие два метода:
override func data(ofType typeName: String) throws -> Data {
// Insert code here to write your document to data of the specified type, throwing an error in case of failure.
// TO BE IMPLEMENTED...
}
override func read(from data: Data, ofType typeName: String) throws {
// Insert code here to read your document from the given data of the specified type, throwing an error in case of failure.
// TO BE IMPLEMENTED...
}
Как мне кодировать мой документ в Data
объект , который я могу вернуть из первого метода изатем декодировать в методе read(from:ofType:)
при необходимости?
Протокол Codable
и NSKeyedArchiver
являются ключевыми компонентами для достижения этой цели.Но когда я пытаюсь закодировать приписанную ему строку следующим образом:
convenience init(from decoder: Decoder) throws {
self.init()
do {
let values = try decoder.container(keyedBy: CodingKeys.self)
attributedString = values.decode(NSAttributedString.Type, forKey: .attributedString)
} catch {
// ...
}
}
я получаю ошибку компилятора:
Нет кандидатов на декодирование, выдающих ожидаемый контекстный тип результата NSAttributedString
Похоже, что NSAttributedString
не поддерживает кодирование / декодирование, но согласно документации оно соответствует NSSecureCoding
, которое наследуется от NSCoding
.
Как я могу кодировать весь документ со всеми его свойствами , включая атрибутную строку?
(Есть ли более простой способ, чем использование NSKeyedArchiver
?)