如果在swift的extension中override方法,你就会发现这有点难办

事情的起因是这样的: 如果想配置当前vc出现时状态栏的样式我们可以这样做:

    override func preferredStatusBarStyle() -> UIStatusBarStyle {
        return .LightContent
    }复制代码

有的vc的状态栏是白色,有的是黑色,总这样override一个方法也是挺碍眼的,那能不能把这个代码移进protocol的extension中呢? 这样的话用起来就像这样:

    class XxxViewController:UIViewController,LightStatusBarStyle {

    }复制代码

想想实现起来很简单嘛:

protocol LightStatusBarStyle:class {
   func preferredStatusBarStyle() -> UIStatusBarStyle
}

extension LightStatusBarStyle where Self:UIViewController {
    func preferredStatusBarStyle() -> UIStatusBarStyle {
        return .LightContent
    }
}复制代码

但是运行起来的时候,你会发现这个方法没有执行。 于是你再观察了一下,忽然发觉可能是少了override。 我就直接把结果贴出来吧:

你会得到一个error。

extension之前还好好的,怎么override就不行了呢? 真相到底是什么? 是Xcode的抽风,是Swift的忽然自我,还是Mac太久没有重启?

欢迎进入本期的:

真相就是:

在extension中可以添加新函数,但是不能override一个已有的函数

官方是这么说的:

Extensions can add new functionality to a type, but they cannot override existing functionality.

总而言之就是:

one more thing

不过我们可以再回忆一下OC的runtime。 可以对方法增加dynamic修饰符声明为OC的方法,这样就可以曲线的在extension中使用override了:

class A : NSObject {
    dynamic func doThing() {
        print("dothing super class")
    }
}
class B: A {
}
extension B {
    override func doThing() {
        print("dothing sub class")
        super.doThing()
    }
}复制代码

不过这对于我在开始想要直接在extension中直接override UIViewcontroller的方法还是没有帮助 ┑( ̄Д  ̄)┍

欢迎关注我的微博:@没故事的卓同学

相关链接:

stackoverflow.com/questions/3…

stackoverflow.com/questions/3…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值