gpt4 book ai didi

Swift - 扩展和协议(protocol) - "super"函数未调用

转载 作者:行者123 更新时间:2023-11-30 12:14:48 25 4
gpt4 key购买 nike

我有以下代码:

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 个协议(protocol),每个协议(protocol)都有扩展,以及 1 个 UIButtonBase 类。

我是 Swift 新手,我想知道为什么当我调用 didAwakeFromNib() 时,Viewable 处的 func didAwakeFromNib() 没有被调用code> 在按钮类中。 (didAwakeFromNib() 在 Fontable 上按我的预期调用)。

最佳答案

didAwakeFromNib() 有两种定义

  1. 定义于Fontable扩展名。
  2. 定义于Viewable扩展名。

Fontable协议(protocol)扩展自 Viewable 。在你上面的代码中didAwakeFromNib() Fontable中的定义扩展会覆盖实现,这就是 foo() 的原因不被调用。

如您的代码 UIButtonBase 所示正在实现 FontableViewabledidAwakeFromNib定义来自Fontable正在被调用。

class UIButtonBase:UIButton, Fontable ,Viewable

所以如果你将其更改为。

class UIButtonBase:UIButton ,Viewable

现在didAwakeFromNib来自Viewable将被调用并最终 foo()将被调用。

关于Swift - 扩展和协议(protocol) - "super"函数未调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45563216/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com