何らかの理由で、いくつかのクロージャーフィールドを含むクラスオブジェクトをシリアル化する必要があります。このようクロージャをエンコードしてデコードする方法はありますか?
:
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ブロックがそうでないのと同じ理由でアーカイブ可能ではないと思います。主な理由は、クロージャをアーカイブすることは、キャプチャするオブジェクト(アーカイブ可能でなければならない)をアーカイブすることを意味します。[この別の質問に対するコメント](https://stackoverflow.com/questions/2172758/encoding-an-objective -c-block#comment30992816_2172845)これについて話します。 – paulvs