Swift dispatch to overridden methods in subclass extensions

so链接
逆变

大意是extension之后override
class A: UIViewController { 
func doThing() { print("dothing super class") } 
override func viewDidLoad() { print("viewdidload superclass") super.viewDidLoad() }}
class B: A { }
extension B { 
override func doThing() { print("dothing sub class") super.doThing() } 
override func viewDidLoad() { print("viewdidload subclass") super.viewDidLoad() }}
let a: A = B()a.doThing()
let vc: UIViewController = B()
vc.viewDidLoad()

输出

dothing 
super classviewdidload
subclassviewdidload superclass

下面的答案:
首先这个A是继承自NSObject的,因为swift的class不能这么玩,

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

但是也不应该在扩展中使用override,这应该是个bug
下面才是正确的写法

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

相关阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,489评论 4 61
  • Swift 介绍 简介 Swift 语言由苹果公司在 2014 年推出,用来撰写 OS X 和 iOS 应用程序 ...
    大L君阅读 8,584评论 3 25
  • 我所写的大部分文章都是慢慢的熬出来的,但是我却还是能坚持下来。当想不出来的时候我就多看看别人的文章,多吸收一点别人...
    善行无痕阅读 1,247评论 0 0
  • 十四年,似乎足够冲淡一切,在文华东方酒店门前依旧一片花海,不知道人们还能坚持多少年,也许只要张国荣的歌曲和电影依旧...
    神枪工作室阅读 2,593评论 0 1

友情链接更多精彩内容