2017-08-08 84 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。可能吗? –