Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 有没有办法对闭包进行编码和解码?_Swift_Serialization_Decode_Encode_Nscoder - Fatal编程技术网

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块不可架构的原因相同。主要原因是归档一个闭包意味着归档它捕获的任何对象(也必须是可归档的),我们谈到了这一点。