扩展Swift中的所有类型?

时间:2014-06-24 18:29:56

标签: generics swift

浏览Swift的库代码我发现:

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

该代码段似乎扩展了所有类型的'描述'领域。 当我尝试在我的代码中执行相同的操作时,我收到错误:

  

example.swift:10:11:非名义类型' T!'不能延长

protocol MyProtocol {
  // ...
}

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

有类似的问题:

但他们未能解决:

  • 这里发生了什么?为什么库代码没问题,但我的代码......不是吗?
  • 是否可以使用符合特定协议的所有类型或所有类型?

1 个答案:

答案 0 :(得分:7)

首先,它并没有扩展所有类型。它扩展了T!,即ImplicitlyUnwrappedOptional<T>。所以它扩展了隐式展开的可选类型,而不是所有类型。

&#34;标题&#34;不是真正的Swift代码;它是自动生成的。自动头生成器中可能存在错误,这使得在某些情况下不会生成真正的Swift代码。别太明白了。

您在自动生成的#34;标题中注意到一个奇怪的事情。是某些内置语法收缩不一致应用 - 类型声明不使用收缩,但扩展名:

struct Array<T>
extension T[]

enum Optional<T>
extension T?

struct ImplicitlyUnwrappedOptional<T>
extension T!

自动页眉生成器中的某些代码可能过于贪婪地用它们的缩小语法替换上述类型。首先,我们假装extension T!实际上说extension ImplicitlyUnwrappedOptional<T>

但是,extension ImplicitlyUnwrappedOptional<T>也没有编译错误&#34;使用未声明的类型&#39;&#39;&#34;&#34;事实上,在自动生成的#34;标题&#34;中,我们有许多带有类型参数的扩展声明实例,例如extension Dictionary<KeyType, ValueType>,不在Swift中编译。这是自动生成标题的另一个错误。

删除类型参数有效:

extension ImplicitlyUnwrappedOptional : MyProtocol {
  // ...
}

这正是this answer中显示的内容。