2

ランタイム引数機能を使用するアセンブリでセレクターのパッチャーを作成しようとしていますが、うまくいきません。誰かが同様の問題を解決しましたか、それともまだ Swift を使用できませんか?

アセンブリでのメソッド定義は次のようになります。

public dynamic func requestCodeApiGateway(phone: NSString) -> AnyObject {
    return TyphoonDefinition.withClass(RequestCodeApiGatewayImpl.self) { (definition) in
        definition.useInitializer("initWithApiService:apiRouter:phone:") { (initializer) in
            // ...
        }
    }
}

そして、私は次のようなパッチャーを作成しています:

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 に答える