2

我正在尝试为使用运行时参数功能但没有运气的程序集中的选择器创建修补程序。有没有人解决过类似的问题,或者它还不能使用 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:") { 
    // ...
}

部分使用 Objective-C 的 PS 解决方案也将不胜感激

4

1 回答 1

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
    

选项 1 和 2 将影响调用该方法的任何 Swift 代码,并且所有方法都将对 Objective-C 代码和 Objective-C 运行时产生相同的影响。

于 2015-01-15T23:39:31.020 回答