如果在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
    }
}

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



你会得到一个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()
    }
}

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

相关链接:
http://stackoverflow.com/questions/38213286/overriding-methods-in-swift-extensions
http://stackoverflow.com/questions/37492897/swift-dispatch-to-overridden-methods-in-subclass-extensions

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,340评论 4 61
  • 分享一下在3.0践行中自己能够坚持每天5点半之前打卡的经验,欢迎留言一起精进,我也承诺在接下来的践行中每天确保5点...
    龙马行天下阅读 5,231评论 1 13
  • 梦到跟老妈在一起开心大口的吃着包子[大哭][大哭][大哭] 原来我只在她那里,才可以固执的做个永远也长不大的孩子…...
    歪大王阅读 1,477评论 0 0
  • 最近听闺蜜聊起她一个表妹的故事,觉得可以拿来当所有女生在爱情中关于怎么对待付出这个话题出来做一个好教材。 姑且先称...
    MissSweeting阅读 2,755评论 0 1
  • 10天前,男友与我大吵了一架,因为我越来越不听他的话,不穿他买的衣服,不走他喜欢的风格,不因为他喜欢有肉感的女生而...
    柠爱那个檬阅读 3,150评论 0 1

友情链接更多精彩内容