有没有办法对闭包进行编码和解码?

Aof*_*eng 4 serialization encode decode nscoder swift

出于某种原因,我需要序列化一个包含多个闭包字段的类对象。

像这样:

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
Run Code Online (Sandbox Code Playgroud)

有什么办法可以得到我想要的吗?

Ita*_*ber 5

闭包不可编码或可解码,因为它们是编译到程序中的块代码。除了他们可能需要动态捕获程序状态的一部分这一事实(这会导致使这项工作面临困难的技术挑战),还要考虑允许您任意编码和解码程序可执行部分的部分的安全隐患。程序:当您尝试将编码的类重新加载回您的应用程序并运行它时会发生什么?如果有人恶意编辑档案以在您的程序中插入代码怎么办?没有合理的方法来判断闭包是否有效/安全运行,过去将其重新加载到您的流程中。

这将是非常不安全的,通常系统甚至不允许。(也许是考虑写与执行的内存-这个安全原因,许多操作系统指定的内存块作为任何可执行[例如在程序代码]可写的[例如数据,你读入内存/操作],但不两个都。)