关于你的选择,我不知道怎么做。
我给了实施
Codable
对于
NSMutableAttributedString
Source
class MutableAttributedStringContainer: Codable {
let attributedString: NSMutableAttributedString
init(attributedString: NSMutableAttributedString) {
self.attributedString = attributedString
}
public required init(from decoder: Decoder) throws {
let container = try decoder.singleValueContainer()
let data = try container.decode(Data.self)
let archiver = try NSKeyedUnarchiver(forReadingFrom: data)
attributedString = NSMutableAttributedString(coder: archiver)!
}
public func encode(to encoder: Encoder) throws {
let archiver = NSKeyedArchiver(requiringSecureCoding: true)
attributedString.encode(with: archiver)
var container = encoder.singleValueContainer()
try container.encode(archiver.encodedData)
}
}
下面是一个如何使用它的例子。
func testing() {
let attributedString = NSMutableAttributedString(string: "Hello world!")
let attributedStringContainer = MutableAttributedStringContainer(attributedString: attributedString)
// Necessary because encoding into a singleValueContainer() creates a
// JSON fragment instead of a JSON dictionary that `JSONEncoder` wants
// create.
struct Welcome: Codable {
var attributedString: MutableAttributedStringContainer
}
let welcome = Welcome(attributedString: attributedStringContainer)
let encoder = JSONEncoder()
encoder.outputFormatting = .prettyPrinted
let data = try! encoder.encode(welcome)
print(String(bytes: data, encoding: .utf8) as Any)
let decoder = JSONDecoder()
let welcome2 = try! decoder.decode(Welcome.self, from: data)
print("decoded to string:", welcome2.attributedString.attributedString.string)
}
可编码的
结构相互建立。如果所有底层结构都实现
编译器可以自己创建编码和解码函数。如果没有,开发人员必须对它们进行编码并将它们放在
CodingKey
,同样用于解码。
编码键
. 也许读一本
Raywenderlich Tutorial
可编码的
为了更好地理解它。
应该有一个可识别的处理流,但我看不出这三种解码器/编码器是如何相互作用或相互替代的。
NSCoding
与合作
NSKeyedUnarchiver/NSKeyedArchiver
和回报
NSData
可编码的
与任何支持
可编码的
JSONEncoder/JSONDecoder
,它返回
Data
以人类可读的格式
JSON
.utf8
.