Как кодировать объект, который содержит приписанную строку для данных? - PullRequest
1 голос
/ 06 марта 2019

У меня есть подкласс 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?)

...