2016-02-27 58 views
33

嵌套類型的我有一個主類,還提供了一個名稱空間:擴展在夫特

class A { 
} 

和通過擴展(全部爲使用單獨的文件的緣故)加入一個嵌套類:

extension A { 
    class B { 
    } 
} 

我想通過擴展它爲嵌套類(B)添加功能;我試過了:

extension A.B { 
} 

我得到''B'不是'A'的成員類型「。

(我也嘗試了一些不太合理的東西,但我會在這裏省略掉,以避免尷尬。斯威夫特閱讀文檔和谷歌搜索「迅速嵌套類擴展」並沒有產生一個答案無論是。)

任何想法如果以及如何完成?


UPDATE:

此代碼的工作作爲一個單一的文件(或在遊樂場)時預計,由於user3441734的嘗試吧!

當3個部分位於單獨的文件中時仍然不起作用,這可能是當前Swift編譯器實現中的一個錯誤。我會向蘋果提交一個錯誤報告。

+0

您正在使用哪個版本的Xcode/Swift? –

+0

嗨馬丁。要清楚,每個定義都在一個單獨的文件中。既然如此,我剛剛設法用Swift 2.2在Xcode 7.3.1中重現了這個問題。 如果你把所有的定義放在一個文件中(就像下面答案中的操場一樣),一切正常。換句話說,這不是Swift的問題,而是編譯器。 – Baglan

回答

61

好像這個問題是關係到SR-631。我遇到過類似的問題,我想編譯器正在嘗試處理文件,將嵌套類擴展到定義它的位置之前。因此,您有這個錯誤說A沒有成員B.

我找到的解決方案是轉到您的目標設置,打開Build Phases

enter image description here

在那裏,在Compile Sources部分,你應該把你定義上面的嵌套類文件的文件,您對它進行擴展。

+7

謝謝你的回答!事實上,源的排序解決了這個問題,這可能意味着編譯器在解析符號時需要一定數量的遍,而這種情況超出了這個數。 我已經向蘋果公司提交了一份錯誤報告,希望他們能夠在未來的Xcode版本中做一些事情。 – Baglan

+1

當通過命令行界面使用swift編譯器時,是否有辦法解決這個問題? – Evert

3

這部作品在我的操場上,如預期

class A { 
} 
extension A { 
    class B { 
    } 
} 
extension A.B { 
    func foo() { 
     print("print from extension A.B") 
    } 
} 
let ab = A.B() 
ab.foo() // print from extension A.B 
+0

確實如此。我認爲,這是Xcode當前在Swift中執行文件的一個錯誤。我會向蘋果提交一個錯誤報告。謝謝! – Baglan