【问题标题】:The required encoding function doesn't shown in a working code所需的编码功能未显示在工作代码中
【发布时间】:2017-12-01 03:05:59
【问题描述】:

序列化反序列化是通过NSCoding协议中定义的两种方法完成的,如下

encodeWithCoder(_ aCoder: NSCoder) {
    // Serialize your object here
}

init(coder aDecoder: NSCoder) {
    // Deserialize your object here
}

在我自己的ViewController(继承自UITableViewController)中,我有一个数组,其中包含我自己的名为Item 的对象,并且我确实实现了init(coder aDecoder: NSCoder) 初始函数。 Item 定义如下

class Item: NSObject, NSCoding {
    var text = ""
    var checked = false

    func toggleChecked() {
            checked = !checked
    }

    func encode(with aCoder: NSCoder) {
        aCoder.encode(self.text, forKey: "SLAText")
        aCoder.encode(self.checked, forKey: "SLAChecked")
    }

    required init?(coder aDecoder: NSCoder) {
        self.text = aDecoder.decodeObject(forKey: "SLAText") as! String
        self.checked = aDecoder.decodeBool(forKey: "SLAChecked")
        super.init()
    }

    override init() {
        super.init()
    }
}

改为实现函数encode(with: NSCoder),我定义了自己的序列化函数,命名为saveItems()

 func saveItems() {
        let data = NSMutableData()
        let archiver = NSKeyedArchiver(forWritingWith: data)

        archiver.encode(items, forKey: "ItemLists") //items is a array of type [Item]
        archiver.finishEncoding()

        data.write(to: dataFilePath(), atomically: true)      
    }

问题

为什么代码没有实现所需的NSCoding 函数?代码是从我正在研究的书的一个例子中简化的,我根本没有找到encodeWithCoder(_ aCoder: NSCoder) 函数。不是必须的手段你必须实现它吗?

感谢您的时间和帮助

【问题讨论】:

  • Item 是如何定义的?
  • @appzYourLife 我添加了Item 类的简单版本

标签: swift cocoa archive nscoding


【解决方案1】:

为什么代码没有实现所需的 NSCoding 功能?

这不是真的。

NSCoding 是一种协议

首先NSCoding 是一个协议,而不是一个函数。为了使类型符合NSCoding,您需要实现一个方法和一个初始化程序

public func encode(with aCoder: NSCoder)
public init?(coder aDecoder: NSCoder)

为什么你的代码有效?

让我们看看你在做什么

archiver.encode(items, forKey: "ItemLists")

这里items 定义为[Item],它是Item(s) 的数组。 并且 Array 确实符合NSCoding。这可以通过编写来轻松测试

let nums = [1, 2, 3]

if nums is NSCoding {
    print("Array does conform to NSCoding")
} else {
    print("Array does NOT conform to NSCoding")
}

结果是

Array does conform to NSCoding

结论

当然,要正常工作,数组内部的元素也必须符合NSCodable。由于您的 Array 的泛型类型是 Item(您已使其符合 NSCodable),因此机制确实正常工作。

【讨论】:

  • @appzYourLive 数组确实符合 NSCoding :这解决了我的误解,感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 2012-08-19
  • 2021-12-25
  • 2022-10-23
  • 1970-01-01
  • 2022-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多