NonObjectiveCBase有什么用?
What use does NonObjectiveCBase have?
我正在阅读 blog post by @AirspeedVelocity, which mentions the ManagedBuffer
class。由于在访问这种类型的 properties/methods 之后我遇到了一些困难,所以我决定稍微检查一下。
类型继承如下:
所以我自然而然地对 ManagedProtoBuffer
and NonObjectiveCBase
感兴趣,并与他们一起玩了一会儿。
我的第一个尝试是简单地创建一个继承自 NonObjectiveCBase
的 class。所以我尝试了以下方式:
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
的文档,确实它没有public方法或属性。关于它的唯一说法是:
A common base class for classes that need to be non-@objc, recognizably in the type system.
因此我的问题是:NonObjectiveCBase
有什么用?
此外,如果我应该调用 super.init
,我怎么能创建一个不存在的子 class?
简短的回答是你可能无法在 stdlib 之外继承它。它看起来非常像 Apple 在特殊情况下需要的东西,但没有提出 generally-available 解决方案。 (Swift 1 在 stdlib 中有很多你实际上无法自己实现的东西,因为它依赖于一些奇怪的 _
前缀协议。Swift 2 做的更少,但仍然有一个一点点。)
因为有publicchildren个NonObjectiveCBase
(比如ManagedBuffer
),超类必须是public。这并不意味着它必须有一个 public 初始值设定项。我自己使用了类似的技术来允许我 return 我不希望调用者能够实例化的类型(因为它们有奇怪的先决条件或需要更多的私有类型来构造。)
就它存在的原因而言,如果历史有任何指导意义,那就是优化问题。当优化器可以绝对确定各种先决条件时,它可以做某些事情。有时,优化器在证明这些先决条件方面并不像 Apple 所希望的那样聪明(考虑 SinkType
,它明确地告诉我们它存在于优化器感到困惑的情况下)。在大多数情况下,Apple 并未向我们提供其特殊的 "because the compiler isn't good enough yet" 工具,这是有道理的。随着他们改进编译器,他们不希望很多人编写与旧实现细节紧密相关的代码。当 Swift 稳定下来时,我希望 Apple 确保我们都可以在 "normal" Swift 中重写 stdlib,但与此同时,我承认它在不断变化。
为了使用
public func isUniquelyReferenced<T : NonObjectiveCBase>(inout object: T) -> Bool
您的 class 必须继承自 NonObjectiveCBase
搜索 'copy on write in swift' 了解更多信息。
我正在阅读 blog post by @AirspeedVelocity, which mentions the ManagedBuffer
class。由于在访问这种类型的 properties/methods 之后我遇到了一些困难,所以我决定稍微检查一下。
类型继承如下:
所以我自然而然地对 ManagedProtoBuffer
and NonObjectiveCBase
感兴趣,并与他们一起玩了一会儿。
我的第一个尝试是简单地创建一个继承自 NonObjectiveCBase
的 class。所以我尝试了以下方式:
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
的文档,确实它没有public方法或属性。关于它的唯一说法是:
A common base class for classes that need to be non-@objc, recognizably in the type system.
因此我的问题是:NonObjectiveCBase
有什么用?
此外,如果我应该调用 super.init
,我怎么能创建一个不存在的子 class?
简短的回答是你可能无法在 stdlib 之外继承它。它看起来非常像 Apple 在特殊情况下需要的东西,但没有提出 generally-available 解决方案。 (Swift 1 在 stdlib 中有很多你实际上无法自己实现的东西,因为它依赖于一些奇怪的 _
前缀协议。Swift 2 做的更少,但仍然有一个一点点。)
因为有publicchildren个NonObjectiveCBase
(比如ManagedBuffer
),超类必须是public。这并不意味着它必须有一个 public 初始值设定项。我自己使用了类似的技术来允许我 return 我不希望调用者能够实例化的类型(因为它们有奇怪的先决条件或需要更多的私有类型来构造。)
就它存在的原因而言,如果历史有任何指导意义,那就是优化问题。当优化器可以绝对确定各种先决条件时,它可以做某些事情。有时,优化器在证明这些先决条件方面并不像 Apple 所希望的那样聪明(考虑 SinkType
,它明确地告诉我们它存在于优化器感到困惑的情况下)。在大多数情况下,Apple 并未向我们提供其特殊的 "because the compiler isn't good enough yet" 工具,这是有道理的。随着他们改进编译器,他们不希望很多人编写与旧实现细节紧密相关的代码。当 Swift 稳定下来时,我希望 Apple 确保我们都可以在 "normal" Swift 中重写 stdlib,但与此同时,我承认它在不断变化。
public func isUniquelyReferenced<T : NonObjectiveCBase>(inout object: T) -> Bool
您的 class 必须继承自 NonObjectiveCBase
搜索 'copy on write in swift' 了解更多信息。