Gom*_*ius 3 nssecurecoding swift
我在创建使用 NSSecureCoding 及其子类的类时遇到问题。
class ClassA: NSObject, NSSecureCoding {
public static var supportsSecureCoding: Bool { return true }
}
class ClassB: ClassA {
public static var supportsSecureCoding: Bool { return true } // "Cannot override static var"
}
Run Code Online (Sandbox Code Playgroud)
我应该这样称呼,因为 NSObject.h 中的文档说,
此属性必须在所有允许安全编码的类上返回 YES。采用 NSSecureCoding 并覆盖 initWithCoder: 的类的子类也必须覆盖此方法并返回 YES。// 编写解码数据的方法时应参考安全编码指南。
目标-C:
@property (class, readonly) BOOL supportsSecureCoding;
Run Code Online (Sandbox Code Playgroud)
迅速:
public static var supportsSecureCoding: Bool { get }
Run Code Online (Sandbox Code Playgroud)
我正在使用 Xcode 10.0,在 Swift 4.0 和 Swift 4.2 上都尝试过。人们如何解决这个问题?任何帮助表示赞赏。
更新:使用 时public class var supportsSecureCoding,它会编译,但在使用Optimize for Speed 时会在运行时崩溃。
static类声明中的 是 的别名final class,即不能在子类中重写的类型方法。你想要的是一个class 方法
public class var supportsSecureCoding: Bool { return true }
Run Code Online (Sandbox Code Playgroud)
可以在子类中重写
override public class var supportsSecureCoding: Bool { return true }
Run Code Online (Sandbox Code Playgroud)
似乎当前的 Swift 优化器在其定义与其超类相同时抑制生成重写的 getter 方法。多么聪明的优化器!?
这种 hack 会抑制这种过于强大的优化。
class ClassB: ClassA {
//...
static private var secureCoding = true
override public class var supportsSecureCoding: Bool { return secureCoding }
}
Run Code Online (Sandbox Code Playgroud)
static private let没有同样的效果。所以,当 Swift 优化器更聪明时,上面的代码可能不起作用。最好尽快发送错误报告。
看来 Swift 优化器已经足够聪明了,上面的解决方法可能不起作用。(参见 Martin R 的评论。)
您可能需要删除private.
class ClassB: ClassA {
//...
static var secureCoding = true
override public class var supportsSecureCoding: Bool { return secureCoding }
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1174 次 |
| 最近记录: |