2016-03-31 24 views
1

Bu sınıfı nasıl hızlıca 2 yazabilirim? NSMethodSignature & NSInvocationNSMethodSignature & NSInvocation eşdeğeri eşdeğeri 2

+1

NSInvocation'ı neden ilk etapta kullandığınızdan emin değilim. Neden bir ptr'yi isteğin ptr'sine temsilci için iletiyorsunuz? İstek zaten değiştirilebilir. Swift'de muhtemelen 'didFinishSelector' yerine 'didFinishBlock' kullanırsınız. – hnh

+0

Bunu yapmadım, sadece buldum ve swift2'ye dönüştürmek istiyorum ama 2 sınıf artık yok –

+0

Bu arada, bu Objective-C kodu yanlış. Satır [invocation setArgument: (__ köprüsü void *) (self) atIndex: 2]; 'yanlıştır. '- [NSInvocation setArgument: atIndex:]' argüman olarak ayarlanacak şeyin işaretçisini alır. Nesneyi gösteren bir işaret olan 'self'i geçiyorsunuz ve bir nesne doğrudan manipüle edilemiyor. Eğer 'self'i argüman olarak ayarlamak istiyorsanız, bunun yerine '& self'i geçmelisiniz. – newacct

cevap

1

NSInvocation Swift mevcut değildir peşin

@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"]; 
    } 
} 

Teşekkür'ın hızlı 2'de artık yok. Ancak, bu durumda, NSInvocation aslında gerekli değildir. Her zaman iki parametreli nesne-işaretçi tipi ile bir yöntemi çağıracağınız argümanlarını belirlediğinizden biliyoruz. (Dizin 2 için self yerine &self kastettiğinizi varsayarsak) Bunu performSelector:withObject:withObject: ile yapabilirsiniz.

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

Bu Swift 2'de mevcuttur:

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

P.S. Bu gerçekten garip çünkü görünüşe göre bir tamamlama işleyicisi alır, bu Swift için mükemmel olur, çünkü gövdenin eksik görünmesi ve tamamlanma işleyicisinin türü doğru olmadığı için doğru değildir. istek al.