2016-03-31 12 views
1

このクラスを迅速な2で書くことはできますか? NSMethodSignature & NSInvocationは迅速2NSMethodSignature&NSInvocation swiftで同等2

@implementation MyAuth 

- (void)authorizeRequest:(NSMutableURLRequest *)request 
       delegate:(id)delegate 
     didFinishSelector:(SEL)sel { 
    if (request) { 
     NSString *value = [NSString stringWithFormat:@"%s %@", GTM_OAUTH2_BEARER, self.accessToken]; 
     [request setValue:value forHTTPHeaderField:@"Authorization"]; 
    } 

    NSMethodSignature *sig = [delegate methodSignatureForSelector:sel]; 
    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:sig]; 
    [invocation setSelector:sel]; 
    [invocation setTarget:delegate]; 
    [invocation setArgument:(__bridge void *)(self) atIndex:2]; 
    [invocation setArgument:&request atIndex:3]; 
    [invocation invoke]; 
} 

- (void)authorizeRequest:(NSMutableURLRequest *)request 
     completionHandler:(void (^)(NSError *error))handler { 
    if (request) { 
     NSString *value = [NSString stringWithFormat:@"%@ %@", @"Bearer", self.accessToken]; 
     [request setValue:value forHTTPHeaderField:@"Authorization"]; 
    } 
} 

事前に感謝の

+1

最初にNSInvocationを使用する理由がわかりません。代理人へのリクエストのptrにptrを渡すのはなぜですか?リクエストは既に変更可能です。 Swiftでは、おそらく 'didFinishSelector'の代わりに 'didFinishBlock'を使用します。 – hnh

+0

私はこれをしなかった、私はそれを見つけた、私はswift2でそれを変換したいが、2つのクラスはもはや存在しない –

+0

ところで、このObjective-Cコードは間違っている。 '[invocation setArgument:(__ bridge void *)(self)atIndex:2];'という行は間違っています。 ' - [NSInvocation setArgument:atIndex:]'は引数として設定するものへのポインタをとります。あなたはオブジェクトへのポインタである 'self'を渡しており、オブジェクトは直接操作できません。引数として 'self'を設定したい場合は、代わりに'&self'を渡す必要があります。 – newacct

答えて

1

NSInvocationにはもはや存在しないスウィフトでは使用できません。しかし、この場合、実際にはNSInvocationは必要ありません。私たちは、あなたが引数を設定しているところから、オブジェクトポインタ型の2つのパラメータを持つメソッドを常に呼び出すことがわかっています。 (インデックス2の場合はselfの代わりに&selfを意味すると仮定します)。これはperformSelector:withObject:withObject:で行うことができます。

[delegate performSelector:sel withObject:self withObject:request] 

これはスウィフト2で提供されています:

delegate?.performSelector(sel, withObject:self, withObject:request) 

P.S.完了ハンドラを取る別のバージョンのメソッドを持っているようですが、Swiftには完璧ですが、ボディが不完全であるように見えますが、完了ハンドラのタイプは正しくないリクエストを取る。

関連する問題