Swift调用动态库带参数方法时perform selector崩溃,求正确调用方式
解决Swift动态库中performSelector调用带参数方法崩溃的问题
问题原因
Swift方法暴露给Objective-C时,默认会将参数标签整合到Objective-C选择器名称中。你定义的printString(myStr:)方法,自动生成的Objective-C选择器并非printString:,而是printStringWithMyStr:,这就是调用时提示“unrecognized selector”的根本原因。
两种解决方案
方案1:显式指定Objective-C选择器名称(推荐)
修改动态库中MyClass的printString方法,用@objc(printString:)显式指定选择器名称,让Swift方法直接映射到你预期的printString:选择器:
@objc public class MyClass : NSObject{ @objc(printString:) public func printString(myStr: NSString) { print("printString : \(myStr)") } @objc public func printAndReturn()-> String { let string = "Test String" print("On print and return \(string) ") return string } }
修改后,你原来的调用代码就能正常工作:
instance1.perform(Selector("printString:"), with: "testString" as NSString)
方案2:使用自动生成的选择器名称(无需修改动态库)
如果无法修改动态库,直接使用Swift自动生成的Objective-C选择器名称printStringWithMyStr:,同时注意将Swift字符串显式转换为NSString(匹配方法参数类型):
instance1.perform(Selector("printStringWithMyStr:"), with: "testString" as NSString)
补充说明
无参数的printAndReturn()方法能正常调用,是因为它的Objective-C选择器就是原方法名printAndReturn,没有参数标签带来的名称变化。
内容的提问来源于stack exchange,提问作者Navaneeth A S
相关产品推荐
相关产品推荐

