You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 08:01:56