2017-08-08 93 views
0

我有以下代碼:斯威夫特 - 擴展 - 協議 - 「超級」功能不叫

protocol Viewable 
{ 
    func didAwakeFromNib() 
    func foo() 
} 

extension Viewable where Self:UIView 
{ 
    func didAwakeFromNib() 
    { 
     // NOT CALLED! 
     foo() 
    } 
} 

protocol Fontable:Viewable 
{ 
    func some1() 
    func some2() 
    func some3() 
} 

extension Fontable where Self:UIView 
{ 
    func didAwakeFromNib() 
    { 
     some1() 
     some2() 
     some3() 
    } 
} 

class UIButtonBase:UIButton,Fontable,Viewable //(Viewable Not necessary here because Fontable already conforms to Viewable) 
{ 
     override func awakeFromNib() 
     { 
      super.awakeFromNib() 
      didAwakeFromNib() 
     } 
} 

正如你可以看到我有2個協議進行擴展每個和1級的UIButtonBase

我是新來的斯威夫特,我想知道爲什麼我的func didAwakeFromNib()Viewable不叫我在按鈕類中調用didAwakeFromNib()。 (按Fontable調用didAwakeFromNib(),如我所料)。

回答

0

有在Fontable擴展定義的didAwakeFromNib()

  1. 兩個定義。
  2. 定義於Viewable擴展名。

Fontable協議從Viewable延伸。在您的上述代碼中didAwakeFromNib()定義Fontable擴展覆蓋了實現,這就是爲什麼foo()未被調用。

在你的代碼UIButtonBaseFontable實現既FontableViewabledidAwakeFromNib定義正在被調用。

class UIButtonBase:UIButton, Fontable ,Viewable 

所以如果你改變了這個。

class UIButtonBase:UIButton ,Viewable 

現在didAwakeFromNibViewable將被調用,並最終foo()將被調用。

+0

嘿,首先 - 謝謝。但我沒有看到區別。因爲你寫了兩次「class UIButtonBase:UIButton,Fontable,Viewable」。這是你的意思嗎? –

+1

Ah typo ...查看更新的答案。 – Bilal

+0

現在我看到:)。但是我想從Viewable AND Fontable中調用didAwakeFromNib。可能嗎? –