【问题标题】:Swift 4.0 Decoder error with closure property具有闭包属性的 Swift 4.0 解码器错误
【发布时间】:2017-08-30 22:56:57
【问题描述】:

我正在尝试使用 Swift 4.0 Codable 协议序列化我的对象。尝试解码闭包属性时遇到错误:

guard let influenceFunction = try? container.decode(((E, Double) -> (E))!.self, forKey: TransformCodingKeys.influenceFunction) else {
    // ... do something clever ...
    print("sad times...")
}

Cannot invoke 'decode' with an argument list of type '(((E, Double) -> (E))!.Type, forKey: TransformCodingKeys)'

我想这很容易理解,但肯定有一些我可以使用的策略(毕竟,函数是一流的对象,对吧?)。我必须以某种方式包装我的闭包吗?

【问题讨论】:

  • 你想解码什么? (E, Double) -> (E) 不符合 Decodable,我看不出它如何用 JSON 等表示。
  • 正如我所提到的,它是一个闭包......请注意,我还没有实现 encode(to:) ,这可能会使问题更加明显!哈!...我想我将不得不在我的 container.decode(from:) 调用之后手动设置这些闭包。应该没问题,因为它们基本上都是硬连线的。
  • 顺便说一句,该类确实确保 E 是可编码的。问题是没有将闭包作为参数的重载......这是可以理解的,因为闭包将如何序列化并不明显,而且无论如何这可能不是一个好主意(安全方面)。 ..

标签: swift serialization closures swift4 codable


【解决方案1】:

你可以用一个技巧来解决这个问题:

typealias YourCompletion = (_ status: Bool) -> Void
class Completion: Codable {
    var completion: YourCompletion?
    private enum CodingKeys: CodingKey {}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    • 2019-02-27
    • 2017-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多