我在Apple文档中找不到与此相关的任何内容。
这是一个场景。
Objective-C类:
@implementation Superclass
- (instancetype)init {
self = [super init];
[self doSomething];
return self;
}
- (void)doSomething {
NSLog(@"\ndoSomething called from Superclass\n");
}
@end
快速子类:
class Subclass: Superclass {
override init() {
super.init()
doSomething()
}
@objc func doSomething() {
print("\n\ndoSomething called from Subclass\n")
}
}
在子类@objc
的方法签名中使用doSomething
导致超类中的方法永远不会被调用,即仅doSomething called from Subclass
被打印到控制台。
删除@objc
可解决此问题。
这是为什么?
答案 0 :(得分:2)
@objc
使该方法可用于Objective-C运行时,
在《 Swift语言参考》中比较here。
因此
@objc func doSomething()
覆盖
- (void)doSomething
在Objective-C超类中定义的实例方法。因此,如果self
是Subclass
的实例,则
[self doSomething];
调用子类方法–无论调用在何处完成。 (消息分发在Objective-C中是完全动态的。) 这就是为什么子类方法被调用两次的原因。
没有@objc
,Swift实例方法对Objective-C不可见,
并且不会覆盖超类方法。
答案 1 :(得分:0)
当@objc用于类声明时,意味着您使用Swift编写了Objective-C类。
@objc用于方法声明意味着实际上将使用Objective-C的String
,{{1}来代替swift的Dictionary
,Notification
,NSString
等。 },NSDictionary
和方法在Objective-C代码中可用。