@objc 关键字扩展子类行为
@objc keyword extension subclass behaviour
有人可以解释为什么这里需要 @objc
关键字来编译代码吗?
据我了解,此关键字用于运行 ObjC 消息方法分派。但这不是 NSObject
实例。
class MyClass {
}
extension MyClass {
@objc func extensionMethod() { /// THIS LINE
print("A")
}
}
class SubClass: MyClass {
override func extensionMethod() {
print("B")
}
}
@objc
关键字和dynamic
一样启用消息发送吗?还是不行?
Does @objc
keyword enable message dispatch as well as dynamic
?
通常不会。通常,@objc
属性本身只是将给定的 class 成员暴露给 Objective-C – Swift 仍然可以使用 table 或静态的方式自由分配给它派遣。如果您希望 Swift 在调用时使用消息调度,您需要将成员标记为 dynamic
。
但是,对于非最终 @objc
class extension 成员,Swift 将自动将其推断为 dynamic
.为什么?因为出于互操作性原因,Swift 允许 @objc
扩展成员覆盖和被覆盖(很像如何覆盖子 class 类别中的 Obj-C 方法)。为了实现这种行为,Swift 依赖于 Obj-C 消息调度。
因此,在扩展中,@objc
推断出 dynamic
。您不能在不将扩展成员暴露给 Obj-C 运行时的情况下覆盖它,因为扩展成员当前无法添加到 Swift class vtables(如 Swift vtables 目前不能在运行时动态添加成员。
But this is not an NSObject
instance.
在 Apple 平台上(即具有 Obj-C 互操作的平台),所有 Swift classes 都暴露给 Obj-C 运行时,并且所有隐式继承自一个特殊的 Obj-C 基础 class,称为 _SwiftObject
,它符合 NSObjectProtocol
。所以 Swift classes 能够利用消息调度而不必继承 NSObject
.
有人可以解释为什么这里需要 @objc
关键字来编译代码吗?
据我了解,此关键字用于运行 ObjC 消息方法分派。但这不是 NSObject
实例。
class MyClass {
}
extension MyClass {
@objc func extensionMethod() { /// THIS LINE
print("A")
}
}
class SubClass: MyClass {
override func extensionMethod() {
print("B")
}
}
@objc
关键字和dynamic
一样启用消息发送吗?还是不行?
Does
@objc
keyword enable message dispatch as well asdynamic
?
通常不会。通常,@objc
属性本身只是将给定的 class 成员暴露给 Objective-C – Swift 仍然可以使用 table 或静态的方式自由分配给它派遣。如果您希望 Swift 在调用时使用消息调度,您需要将成员标记为 dynamic
。
但是,对于非最终 @objc
class extension 成员,Swift 将自动将其推断为 dynamic
.为什么?因为出于互操作性原因,Swift 允许 @objc
扩展成员覆盖和被覆盖(很像如何覆盖子 class 类别中的 Obj-C 方法)。为了实现这种行为,Swift 依赖于 Obj-C 消息调度。
因此,在扩展中,@objc
推断出 dynamic
。您不能在不将扩展成员暴露给 Obj-C 运行时的情况下覆盖它,因为扩展成员当前无法添加到 Swift class vtables(如 Swift vtables 目前不能在运行时动态添加成员。
But this is not an
NSObject
instance.
在 Apple 平台上(即具有 Obj-C 互操作的平台),所有 Swift classes 都暴露给 Obj-C 运行时,并且所有隐式继承自一个特殊的 Obj-C 基础 class,称为 _SwiftObject
,它符合 NSObjectProtocol
。所以 Swift classes 能够利用消息调度而不必继承 NSObject
.