我试图在程序集中使用运行时参数功能创建选择器,但没有运气。有没有人解决过类似的问题,或者它还无法使用Swift?
程序集中的方法定义如下所示:
public dynamic func requestCodeApiGateway(phone: NSString) -> AnyObject {
return TyphoonDefinition.withClass(RequestCodeApiGatewayImpl.self) { (definition) in
definition.useInitializer("initWithApiService:apiRouter:phone:") { (initializer) in
// ...
}
}
}
我正在创建像这样的Patcher:
let patcher = TyphoonPatcher()
patcher.patchDefinitionWithSelector("requestCodeApiGatewayWithPhone:") {
// ...
}
P.S。部分使用Objective-C的解决方案也将受到赞赏
答案 0 :(得分:2)
看起来你在patchDefinitionWithSelector
中使用了错误的选择器。除init
外,初始参数不作为外部参数名称公开,也不包含在选择器中。
requestCodeApiGateway(NSString)
的选择器为requestCodeApiGateway:
。
更新代码以使用该选择器应该可以解决问题:
patcher.patchDefinitionWithSelector("requestCodeApiGateway:") {
// ...
}
或者,您可以通过以下任何方式使选择器为requestCodeApiGatewayWithPhone:
:
重命名方法:
public dynamic func requestCodeApiGatewayWithPhone(phone: NSString) -> AnyObject
使用简写或简写表示法公开外部参数名称:
public dynamic func requestCodeApiGateway(phone phone: NSString) -> AnyObject
public dynamic func requestCodeApiGateway(#phone: NSString) -> AnyObject
覆盖使用Objective-C运行时注册的选择器:
@objc(requestCodeApiGatewayWithPhone:)
public dynamic func requestCodeApiGateway(phone: NSString) -> AnyObject
选项1和2将影响调用该方法的所有Swift代码,并且所有方法将对Objective-C代码和Objective-C运行时具有相同的效果。