Bu sınıfı nasıl hızlıca 2 yazabilirim? NSMethodSignature & NSInvocationNSMethodSignature & NSInvocation eşdeğeri eşdeğeri 2
1
A
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.
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
Bunu yapmadım, sadece buldum ve swift2'ye dönüştürmek istiyorum ama 2 sınıf artık yok –
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