有人能解释为什么在这里需要使用@objc
关键字才能编译代码吗?
据我了解,这个关键字是为了使ObjC消息方法分派正常工作。但这不是一个NSObject
实例。
class MyClass {
}
extension MyClass {
@objc func extensionMethod() { /// THIS LINE
print("A")
}
}
class SubClass: MyClass {
override func extensionMethod() {
print("B")
}
}
@objc
关键字是否像dynamic
一样启用消息分发?还是不启用?
@objc open override var accessibilityLabel: String?{...
,它是否可以毫无疑问地工作?! - mfaaniUIButton
扩展中定义@objc open override var accessibilityLabel: String?
,因为如果UIButton
添加了自己的accessibilityLabel
覆盖,就不能保证你的实现会被调用(就像在 Obj-C 类的两个类别中定义相同方法一样,无法保证哪个实现会被调用)。只有在可以保证给定类有一个实现的情况下才是可靠的(例如在 OP 的示例中,他们正在子类中进行覆盖)。 - HamishNSObject
的成员隐式推断@objc
属性。因此,如果MyClass
继承自NSObject
(编译器会推断出@objc
),OP 的示例在 Swift 3 中将会编译通过而不需要显式指定@objc
。但现在,无论是否继承自NSObject
,编译器都要求显式指定@objc
,以明确你正在将其暴露给 Obj-C。 - Hamishfinal
,那么这是否会使其成为静态分派? - David James