在Swift中如何扩展所有类型?

4

我浏览了Swift的库代码,发现:

extension T! : Printable {
  var description: String { get }
}

代码片段似乎在所有类型中扩展了“description”字段。 当我尝试在我的代码中做同样的事情时,我得到了错误:

example.swift:10:11: 非名义类型'T!'无法扩展

protocol MyProtocol {
  // ...
}

extension T! : MyProtocol { // error: Non-nominal...
  // ...
}

以下是类似的问题:

但它们没有解决以下问题:

  • 这里发生了什么? 为什么库代码可以,但我的代码不行?
  • 是否可以对所有类型或符合特定协议的所有类型进行操作?

1
类似的问题(没有被接受的答案)可以在这里找到:http://stackoverflow.com/questions/24185549/whats-the-difference-between-optionalt-and-optional-types-in-swift-error-ha。 - Martin R
2
这里可能存在一些双重标准,Swift开发人员将某些功能保留给自己。 - Sergey Kalinichenko
你说得对!我想知道为什么库代码可以工作,但我的代码无法编译。 - Andy
1个回答

8
首先,它并不扩展所有类型。 它扩展的是 T!,即 ImplicitlyUnwrappedOptional<T>。 因此,它扩展了隐式解包可选类型,而不是所有类型。
"header" 并不是真正的 Swift 代码;它是自动生成的。 在某些情况下,自动标头生成器可能存在错误,导致它不能在某些情况下生成真正的 Swift 代码。 不要过于字面理解它。
在自动生成的 "header" 中,你会注意到一件奇怪的事情,即某些内置语法缩写应用不一致——类型声明不使用缩写,但扩展使用缩写:
struct Array<T>
extension T[]

enum Optional<T>
extension T?

struct ImplicitlyUnwrappedOptional<T>
extension T!

可能是自动头文件生成器中的某些代码过于贪心,用其缩写语法替换上述类型。因此,我们首先假装extension T!实际上是extension ImplicitlyUnwrappedOptional<T>
然而,extension ImplicitlyUnwrappedOptional<T>也无法编译,出现错误“使用未声明的类型'T'”。事实上,在自动生成的“头文件”中,我们看到了许多具有类型参数的扩展声明,例如extension Dictionary<KeyType, ValueType>,在Swift中无法编译。这是自动头文件生成中的另一个错误。
但是,删除类型参数可以解决问题:
extension ImplicitlyUnwrappedOptional : MyProtocol {
  // ...
}

这正是在此答案中所展示的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接