2014-06-24 88 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顯示什麼。