我正在尝试构建一个应用程序来创建一个房间的平面图。为此,我使用了ARWorldMap和ARPlaneAnchors,但最近我发现了RoomPlan API的Beta版本,这似乎带来了更好的结果。
但是,我使用te可以使用ARWorldMap协议保存NSCoding,但是当我试图对CapturedRoom对象:-[__SwiftValue encodeWithCoder:]: unrecognized selector sent to instance 0x141c18110进行编码时,会引发错误。
我用于编码包含CapturedRoom的类的代码:
import RoomPlan
class RoomPlanScan: NSObject, NSCoding {
var capturedRoom: CapturedRoom
var title: String
var notes: String
init(capturedRoom: CapturedRoom, title: String, notes: String) {
self.capturedRoom = capturedRoom
self.title = title
self.notes = notes
}
required convenience init?(coder: NSCoder) {
guard let capturedRoom = coder.decodeObject(forKey: "capturedRoom") as? CapturedRoom,
let title = coder.decodeObject(forKey: "title") as? String,
let notes = coder.decodeObject(forKey: "notes") as? String
else { return nil }
self.init(
capturedRoom: capturedRoom,
title: title,
notes: notes
)
}
func encode(with coder: NSCoder) {
coder.encode(capturedRoom, forKey: "capturedRoom")
coder.encode(title, forKey: "title")
coder.encode(notes, forKey: "notes")
}
}为了明确起见,下面的代码执行工作:
import RoomPlan
class RoomPlanScan: NSObject, NSCoding {
var worldMap: ARWorldMap
var title: String
var notes: String
init(worldMap: ARWorldMap, title: String, notes: String) {
self.worldMap = worldMap
self.title = title
self.notes = notes
}
required convenience init?(coder: NSCoder) {
guard let capturedRoom = coder.decodeObject(forKey: "worldMap") as? ARWorldMap,
let title = coder.decodeObject(forKey: "title") as? String,
let notes = coder.decodeObject(forKey: "notes") as? String
else { return nil }
self.init(
worldMap: worldMap,
title: title,
notes: notes
)
}
func encode(with coder: NSCoder) {
coder.encode(worldMap, forKey: "worldMap")
coder.encode(title, forKey: "title")
coder.encode(notes, forKey: "notes")
}
}我正在使用NSKeyedArchiver将对象写入一个本地文件,所以如果我可以使用NSCoder保持相同的结构,那就太好了。我如何修复这个问题并保存一个CapturedRoom?
发布于 2022-08-25 08:33:09
问题在于如何保存CaptureRoom。根据文档,它不符合NS(Secure)Coding,但它符合Decodable、Encodable和Sendable
所以您可以使用Encoder/Decoder来执行CaptureRoom <-> Data,您可以使用桥NSData/Data,因为NSData是符合NS(Secure)Coding的。
所以,它可能类似于下面的代码。我将使用JSONEncoder/JSONDecoder作为部分Encoder/Decoder,因为它们非常常见。
let capturedRoomData = try! JSONEncoder().encode(capturedRoom) as NSData
coder.encode(capturedRoomData, forKey: "capturedRoom")let captureRoomData = coder.decodeObject(forKey: "capturedRoom") as! Data
let captureRoom = try! JSONDecoder().decode(CaptureRoom.self, data: captureRoomData)附带说明:
我使用了强制展开(使用!)来简化代码逻辑,但是当然,您可以使用! guard let、if let等)。
https://stackoverflow.com/questions/73475844
复制相似问题