2014-06-24 54 views
4

浏览斯威夫特的库代码,我发现:在Swift中扩展所有类型?

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

的片段似乎与“说明”字段延长所有类型。 当我尝试做同样的事情在我的代码,我得到错误:

example.swift:10:11: Non-nominal type 'T!' cannot be extended

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。 –

+2

Swift开发人员可以为自己保留一些*功能。[http://en.wikipedia.org/wiki/Quod_licet_Iovi,_non_licet_bovi]可能存在[某些双重标准在这里]。 – dasblinkenlight

+0

你是对的!我想知道为什么库代码可以工作,但我的代码不能编译。 – Andy

回答

7

首先,它没有扩展所有类型。它延伸T!,这是ImplicitlyUnwrappedOptional<T>。所以它扩展了隐式解包的可选类型,而不是所有的类型。

“标题”不是真的Swift代码;它是自动生成的。自动标题生成器中可能存在一些错误,使得它在某些情况下不会生成真正的Swift代码。不要从字面上理解。

您在自动生成的“头”注意的一周奇怪的是,某些内置语法收缩是不一致的应用 - 类型声明不使用收缩,但延长的作用:

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 { 
    // ... 
} 

这也正是在this answer显示什么。