$(SWIFT_MODULE_NAME)-Swift.h在哪里

带@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的方法命名约定。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容