Swift - 使用运行时参数的选择器定义补丁

时间:2015-01-15 23:20:25

标签: ios swift typhoon

我试图在程序集中使用运行时参数功能创建选择器,但没有运气。有没有人解决过类似的问题,或者它还无法使用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的解决方案也将受到赞赏

1 个答案:

答案 0 :(得分:2)

看起来你在patchDefinitionWithSelector中使用了错误的选择器。除init外,初始参数不作为外部参数名称公开,也不包含在选择器中。

requestCodeApiGateway(NSString)的选择器为requestCodeApiGateway:

更新代码以使用该选择器应该可以解决问题:

patcher.patchDefinitionWithSelector("requestCodeApiGateway:") { 
    // ...
}

或者,您可以通过以下任何方式使选择器为requestCodeApiGatewayWithPhone:

  1. 重命名方法:

    public dynamic func requestCodeApiGatewayWithPhone(phone: NSString) -> AnyObject
    
  2. 使用简写或简写表示法公开外部参数名称:

    public dynamic func requestCodeApiGateway(phone phone: NSString) -> AnyObject
    public dynamic func requestCodeApiGateway(#phone: NSString) -> AnyObject
    
  3. 覆盖使用Objective-C运行时注册的选择器:

    @objc(requestCodeApiGatewayWithPhone:)
    public dynamic func requestCodeApiGateway(phone: NSString) -> AnyObject
    
  4. 选项1和2将影响调用该方法的所有Swift代码,并且所有方法将对Objective-C代码和Objective-C运行时具有相同的效果。