首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用CapturedRoom保存NSCoder

如何使用CapturedRoom保存NSCoder
EN

Stack Overflow用户
提问于 2022-08-24 15:26:00
回答 1查看 165关注 0票数 0

我正在尝试构建一个应用程序来创建一个房间的平面图。为此,我使用了ARWorldMap和ARPlaneAnchors,但最近我发现了RoomPlan API的Beta版本,这似乎带来了更好的结果。

但是,我使用te可以使用ARWorldMap协议保存NSCoding,但是当我试图对CapturedRoom对象:-[__SwiftValue encodeWithCoder:]: unrecognized selector sent to instance 0x141c18110进行编码时,会引发错误。

我用于编码包含CapturedRoom的类的代码:

代码语言:javascript
复制
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")
    }
    
}

为了明确起见,下面的代码执行工作:

代码语言:javascript
复制
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?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-25 08:33:09

问题在于如何保存CaptureRoom。根据文档,它不符合NS(Secure)Coding,但它符合DecodableEncodableSendable

所以您可以使用Encoder/Decoder来执行CaptureRoom <-> Data,您可以使用桥NSData/Data,因为NSData是符合NS(Secure)Coding的。

所以,它可能类似于下面的代码。我将使用JSONEncoder/JSONDecoder作为部分Encoder/Decoder,因为它们非常常见。

  • Encoding:

代码语言:javascript
复制
let capturedRoomData = try! JSONEncoder().encode(capturedRoom) as NSData
coder.encode(capturedRoomData, forKey: "capturedRoom")

  • Decoding:

代码语言:javascript
复制
let captureRoomData = coder.decodeObject(forKey: "capturedRoom") as! Data
let captureRoom = try! JSONDecoder().decode(CaptureRoom.self, data: captureRoomData)

附带说明:

我使用了强制展开(使用!)来简化代码逻辑,但是当然,您可以使用! guard letif let等)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73475844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档