NonObjectiveCBase有什么用?

时间:2015-08-05 14:03:57

标签: swift init

我正在阅读@AirspeedVelocity的blog post,其中提到ManagedBuffer类。由于我在访问这种类型的属性/方法时遇到了一些困难,我决定稍微检查一下。
该类型继承如下: enter image description here
所以我很自然地对ManagedProtoBufferNonObjectiveCBase感兴趣,并且和他们玩了一下 我的第一个努力就是创建一个继承自NonObjectiveCBase的类。所以我尝试了以下方式:

class Example: NonObjectiveCBase {
    var value: Int

    init(value: Int) {
        self.value = value
    }
}

这给了我错误:super.init isn't called before returning from initializer

当然,我只是添加了super.init()

init(value: Int) {
    super.init()
    self.value = value
}

现在这给了我以下错误:NonObjectiveCBase' does not have a member named 'init'

所以我检查了NonObjectiveCBase上的文档,实际上它没有公共方法或属性。关于它的唯一说法是:

  

需要非@ objc的类的公共基类,可以在类型系统中识别。

我的问题是:NonObjectiveCBase有什么用处? 此外,如果我打算调用super.init而不存在,我怎么能创建一个子类?

2 个答案:

答案 0 :(得分:2)

简短的回答是你可能无法继承stdlib之外的这个。它看起来非常像Apple在特殊情况下需要的东西,但没有提供普遍可用的解决方案。 (Swift 1在stdlib中有很多你实际上无法实现的东西,因为它依赖于一些奇怪的_ - 前缀协议.Swift 2做得更少,但仍然有一点。)

因为有NonObjectiveCBase的公开子项(例如ManagedBuffer),所以超类必须是公共的。这并不意味着它必须有一个公共初始化器。我自己使用了类似的技术,允许我返回我不希望调用者能够实例化的类型(因为它们有奇怪的前置条件或者需要更多私有类型来构造。)

就其存在的原因而言,如果历史可以作为指导,那就是优化问题。当优化器可以完全确定各种前提条件时,它可以执行某些操作。有时优化器并没有像Apple那样明智地证明这些先决条件(考虑SinkType,它明确告诉我们它存在于优化器混淆的情况下)。在大多数情况下,Apple没有使用它的特殊“因为编译器还不够好”我们可以使用的工具,这是有道理的。当他们改进编译器时,他们不希望很多人编写与旧的实现细节紧密相关的编写代码。当Swift安顿下来时,我希望Apple确保我们都可以在“普通”Swift中重写stdlib,但与此同时,我接受它的变化。

答案 1 :(得分:1)

enter image description here为了使用

public func isUniquelyReferenced<T : NonObjectiveCBase>(inout object: T) -> Bool

您的班级必须继承自NonObjectiveCBase

搜索&#39;复制写在swift&#39;了解更多信息。