swift – @objc关键字扩展子类行为

swift – @objc关键字扩展子类行为,第1张

概述有人可以解释为什么需要@objc关键字来编译代码吗? 据我所知,这个关键字用于工作ObjC消息方法调度.但这不是NSObject实例. class MyClass { } extension MyClass { @objc func extensionMethod() { /// THIS LINE print("A") } 有人可以解释为什么需要@objc关键字来编译代码吗?

据我所知,这个关键字用于工作ObjC消息方法调度.但这不是NSObject实例.

class MyClass { }    extension MyClass {        @objc func extensionMethod() { /// THIS liNE            print("A")        }    }    class SubClass: MyClass {        overrIDe func extensionMethod() {            print("B")        }    }

@objc关键字是否支持消息调度以及动态?或不?

Does @objc keyword enable message dispatch as well as dynamic?

通常不是.通常,@ objc属性本身只是将给定的类成员暴露给Objective-C – Swift仍然可以使用表或静态分派自由地调度它.如果您希望Swift在调用时使用消息调度,则需要将该成员标记为动态.

但是,对于非最终的@objc类扩展成员,Swift会自动推断它是动态的.为什么?因为出于互 *** 作性的原因,Swift允许@objc扩展成员覆盖并被覆盖(就像你可以覆盖子类类别中的Obj-C方法一样).为了实现这种行为,Swift依赖于Obj-C消息调度.

因此,在扩展中,@ objc推断动态.您不能覆盖扩展成员而不将其暴露给Obj-C运行时,因为扩展成员当前无法添加到Swift类vtable中(因为Swift vtable目前不能在运行时动态添加成员).

But this is not an NSObject instance.

在Apple平台(即具有Obj-C interop的平台)上,所有Swift类都暴露给Obj-C运行时,并且都隐式继承了一个名为_SwiftObject的特殊Obj-C基类,它符合NSObjectProtocol.因此,Swift类能够利用消息调度而无需继承NSObject.

总结

以上是内存溢出为你收集整理的swift – @objc关键字扩展子类行为全部内容,希望文章能够帮你解决swift – @objc关键字扩展子类行为所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1043892.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存