macos - 快速子类初始化缠结

标签 macos swift serialization init

我有一个带有两个 init 方法的基类 - 一个是用参数列表指定的,另一个是从 NSDictionary (用于序列化对象)获取参数值的便捷 init。一切都很好,直到我尝试创建一个子类 - 如果我尝试调用匹配的 super.init(...) 并要求我调用子类的指定 init,那么便利 init 会产生错误。父类(super class)包含用于提取参数值的键,我不想重复代码或具有公钥值。

我可以设置虚拟值并使用单独的 loadFromDict() 方法(然后可以覆盖该方法),但这看起来很尴尬。还有别的办法吗?

最佳答案

您看到的错误是正常的,就好像遵循 Swift 中的初始化规则一样。便利 init 必须始终调用同一类中的另一个 init。另一个 init 可能是另一个便利,也可能是指定的。但在某些时候,在调用父类(super class)之前,需要在子类中调用指定的 init。 Swift 强制只有指定的 init 才能调用父类(super class) init。这是来自Swift Language reference

To simplify the relationships between designated and convenience initializers, Swift applies the following three rules for delegation calls between initializers:

Rule 1

A designated initializer must call a designated initializer from its immediate superclass.

Rule 2

A convenience initializer must call another initializer from the same class.

Rule 3

A convenience initializer must ultimately call a designated initializer.

A simple way to remember this is:

Designated initializers must always delegate up.

Convenience initializers must always delegate across.

关于macos - 快速子类初始化缠结,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32098366/

相关文章:

c++ - 有什么方法可以配置 waf 以在 mac os 中构建 c++ 程序?

ios - CGRectIntersectsRect 中的 prepareforsegue

C# 使用 proto-buf 序列化继承的类,而不使用 ProtoInclude

mysql - 在 Mac OS X 上使用 R 访问 MySQL 数据库

python - Mac OS X pygame 输入进入终端而不是 Python

ios - 具有附加依赖项的 UINavigationController 子类初始值设定项

swift - Swift 4 中的 Watson Assistant 产生错误

c++ - Boost C++ 序列化一个 char *

c# - 将异常序列化为可抛出

macos - Cocoa 应用程序尝试在崩溃时启动 lldb?