gpt4 book ai didi

ios - 当类不提供实现时,为什么可以调用 init 的无参数版本?

转载 作者:可可西里 更新时间:2023-10-31 23:44:14 25 4
gpt4 key购买 nike

我一直在审查 Swift documentation on inheritance ,有一件事我认为我不太明白:似乎我可以在几乎任何 Cocoa Touch 类上调用默认的无参数初始值设定项,尽管根据规则,我似乎不应该能够到。

例如,考虑 NSNumber 类,它直接继承自 NSObjectNSObject 定义了一个指定的初始化器: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 确实 定义了它自己的指定初始化器,我希望根据规则 1NSNumber不会继承 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com