Swift 有没有办法对闭包进行编码和解码?
出于某种原因,我需要序列化一个包含多个闭包字段的类对象 像这样:Swift 有没有办法对闭包进行编码和解码?,swift,serialization,decode,encode,nscoder,Swift,Serialization,Decode,Encode,Nscoder,出于某种原因,我需要序列化一个包含多个闭包字段的类对象 像这样: import Foundation class Foo: NSObject, NSCoding { var bar: (() -> Void) override init() { bar = {} } required init(coder aDecoder: NSCoder) { bar = aDecoder.decodeObject(forKey:
import Foundation
class Foo: NSObject, NSCoding {
var bar: (() -> Void)
override init() {
bar = {}
}
required init(coder aDecoder: NSCoder) {
bar = aDecoder.decodeObject(forKey: "bar") as! (() -> Void)
}
func encode(with aCoder: NSCoder) {
aCoder.encode(bar, forKey: "bar")
}
}
let foo = Foo()
foo.bar = {
print("Help!")
}
let data = NSKeyedArchiver.archivedData(withRootObject: foo)
let object = NSKeyedUnarchiver.unarchiveObject(with: data) as! Foo
有什么办法可以得到我想要的吗?闭包是不可编码或可解码的,因为它们是编译到程序中的代码块。除此之外,他们可能需要动态地捕获程序状态的一部分(这导致了实现此功能的困难技术挑战),考虑允许您任意编码和解码程序的可执行部分的安全性:当您试图将编码类重新加载到应用程序并运行它时会发生什么?如果有人恶意编辑了一个归档文件以将代码插入到您的程序中,该怎么办?在将闭包重新加载到流程中之后,没有合理的方法来判断闭包运行是否有效/安全
这将是非常不安全的,系统通常甚至不允许这样做。(也许看看可写内存和可执行内存——出于这个安全原因,许多操作系统将内存块指定为可执行的[例如,程序中的代码]或可写的[例如,读入内存/操作的数据],但不是两者都指定。)我认为它们不可架构,原因与Objective-C块不可架构的原因相同。主要原因是归档一个闭包意味着归档它捕获的任何对象(也必须是可归档的),我们谈到了这一点。