- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我一直在审查 Swift documentation on inheritance ,有一件事我认为我不太明白:似乎我可以在几乎任何 Cocoa Touch 类上调用默认的无参数初始值设定项,尽管根据规则,我似乎不应该能够到。
例如,考虑 NSNumber
类,它直接继承自 NSObject
。 NSObject
定义了一个指定的初始化器:init()
。 NSNumber
定义了一堆指定的初始值设定项(如 init(int value: Int32)
等),但不会覆盖 init ()
。
根据文档,这些是规则:
Assuming that you provide default values for any new properties you introduce in a subclass, the following two rules apply:
Rule 1: If your subclass doesn’t define any designated initializers, it automatically inherits all of its superclass designated initializers.
Rule 2: If your subclass provides an implementation of all of its superclass designated initializers—either by inheriting them as per rule 1, or by providing a custom implementation as part of its definition—then it automatically inherits all of the superclass convenience initializers.
These rules apply even if your subclass adds further convenience initializers.
由于 NSNumber
确实 定义了它自己的指定初始化器,我希望根据规则 1,NSNumber
不会继承 init()
初始值设定项。但是 init()
包含在 Xcode 自动完成中,它不会导致编译器错误。
类之间的运行时行为似乎有所不同。 NSNumber
似乎在您调用该初始化程序时崩溃。 NSInputStream
(我第一次遇到这个问题)没有,但似乎没有正确初始化子类实例变量。
这似乎应该是一个编译器错误。这只是 Swift 中的一个错误,还是我遗漏了什么?
最佳答案
NSNumber 和其他 NS 类不遵循 Swift 规则的原因是因为它们纯粹是在 Objective-C 中实现的。
根据 NSObject 子类的定义方式,将决定 Swift 如何与之交互。
最基本的子类将允许通过 Swift 调用 init()
和 init(value: String)
:
@interface SomeClass : NSObject
@property (nonatomic, strong) NSString *value;
- (instancetype)initWithValue:(NSString *)value;
@end
正确的子类实现将使 Swift 只能调用 init(value: String)
,如果调用 init()
将导致编译器错误:
@interface SomeClass : NSObject
@property (nonatomic, strong) NSString *value;
- (instancetype)initWithValue:(NSString *)value NS_DESIGNATED_INITIALIZER;
- (instancetype)init __attribute__((unavailable("init is unavailable")));
@end
看起来 NSNumber 正在使用更接近第一种方法的东西
关于ios - 当类不提供实现时,为什么可以调用 init 的无参数版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35447121/
我需要计算像这样存储的 2 个短数据数组的 FFT(重复百万次): 等等。 数组值用黄色和蓝色表示。每个 K 值都有一个大小为 K 的未使用数据空间,我需要跳过。 我对数据进行了重新排序(和 floa
我是一名优秀的程序员,十分优秀!