如何解决使 CAShapeLayer 和 CGPath 符合 Codable 或 NSCoding
我正在尝试使用 Codable 协议在 .json 文件中保存和获取有关 CAShapeLayers 的信息,但出现错误:
public class Node: Codable {
public var name: String = ""
public var path: CGPath?
public var baseLayer: CAShapeLayer?
public required init(from decoder: Decoder) throws {
let container = try? decoder.container(keyedBy: NodeCodingKeys.self)
let _name = try container?.decodeIfPresent(String.self,forKey: NodeCodingKeys.name)
let _baseLayer = try container?.decodeIfPresent(CAShapeLayer.self,forKey: NodeCodingKeys.baseLayer)
name = _name ?? ""
}
public func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: NodeCodingKeys.self)
try container.encode(name,forKey: NodeCodingKeys.name)
}
}
public enum NodeCodingKeys: CodingKey {
case path
case name
case baseLayer
}
CGPath 也是如此。有什么方法可以将它们保存到设备/从设备接收它们?
解决方法
我找不到让 CAShapeLayer
符合 Codable
的方法,所以我为我的数据对象创建了类:
public class ImageNode: NSObject,NSCoding,NSSecureCoding {
public static var supportsSecureCoding = true
var name: NSString
var baseLayer: CAShapeLayer
init(name: NSString,baseLayer: CAShapeLayer
) {
self.name = name
self.baseLayer = baseLayer
}
public func encode(with coder: NSCoder) {
coder.encode(name,forKey: "name")
coder.encode(baseLayer,forKey: "baseLayer")
}
public required convenience init?(coder: NSCoder) {
guard let name = coder.decodeObject(forKey: "name") as? NSString
else { return nil }
guard let baseLayer = coder.decodeObject(forKey: "baseLayer") as? CAShapeLayer
else { return nil }
print("decode node")
self.init(
name: name,baseLayer: baseLayer
)
} }
与 NSKeyedArchiver
和 NSKeyedUnarchiver
配合使用,可以将数据保存到文件并检索它。也许这个解决方案会对某人有所帮助。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。