带@objc的swift代码会生成对应的Objective-C的头文件,
实际上就是转译了的Objective-C代码
find ~/Library/Developer/Xcode/DerivedData/ProductName-eiiaidnlwwmavuhcaxaeacvcitjh/ -name "ProductName-Swift.h"
发现在这下面:
~/Library/Developer/Xcode/DerivedData/-eiiaidnlwwmavuhcaxaeacvcitjh//Build/Intermediates.noindex/ProductName.build/Debug-iphonesimulator/ProductName.build/DerivedSources
比如swift代码:
@objc func handleJSCall(options:Parameters) -> Bool
翻译成:
- (BOOL)handleJSCallWithOptions:(NSDictionary<NSString *, id> * _Nonnull)options SWIFT_WARN_UNUSED_RESULT;
因此在
Objective-C直接调用的时候是这个样子的(注意方法名改变了):
SEL selector = NSSelectorFromString(@"handleJSCallWithOptions:");
if ([viewController respondsToSelector:selector]) {
IMP imp = [viewController methodForSelector:selector];
void (*func)(id, SEL,NSDictionary * ) = (void *)imp;
func(viewController, selector, params);
}
这是因为Swift的方法带了参数声明,如果忽略这个参数
@objc func handleJSCall(_ options:Parameters) -> Bool
则不会自动转为 handleJSCallWithOptions:
这是OC的方法命名约定。