2017-08-08 6 views
0

I次のコードを持っている:スウィフト - エクステンション&プロトコル - 「スーパー」関数が呼び出されない

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つのプロトコル、およびUIButtonBaseの1クラスを持っています。

私はSwiftの新機能です。ボタンクラスでdidAwakeFromNib()を呼び出すとfunc didAwakeFromNib()Viewableにコールされない理由を知りたいと思います。 (FontableのdidAwakeFromNib()は私が期待通りに呼んだ)。

答えて

0

Fontable拡張子で定義されdidAwakeFromNib()

  1. の二つの定義があります。
  2. Viewable拡張子で定義されます。

FontableプロトコルはViewableから拡張されています。上のコードdidAwakeFromNib()の定義でFontableの拡張子が実装をオーバーライドしているため、foo()が呼び出されません。あなたのコードUIButtonBaseと同様に

Fontableから両方FontableViewabledidAwakeFromNib定義が呼び出されて実施しています。

class UIButtonBase:UIButton, Fontable ,Viewable 

だからこれを変更した場合。 Viewableから

class UIButtonBase:UIButton ,Viewable 

didAwakeFromNibが呼び出され、最終的にfoo()が呼び出されます。

+0

おはよう、まずは、ありがとうございます。しかし、私は違いが表示されません。あなたが「class UIButtonBase:UIButton、Fontable、Viewable」という2回書いたからです。それはあなたが意味することですか? –

+1

ああ、タイプミス...更新された答えを見てください。 – Bilal

+0

今私は:)参照してください。しかし、私はdidAwakeFromNibをViewableとFontableから呼びたいと思っています。出来ますか? –

関連する問題