2016-03-31 2 views
1

Как я могу записать этот класс в swift 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 вы, вероятно, используете «didFinishBlock» вместо «didFinishSelector». – hnh

+0

Я этого не делал, я просто нашел его, и я хочу его преобразовать в swift2, но 2 класса больше не существуют –

+0

Кстати, этот код Objective-C неверен. Строка '[invocation setArgument: (__ bridge void *) (self) atIndex: 2];' неверна. '- [NSInvocation setArgument: atIndex:]' принимает указатель на предмет, заданный как аргумент. Вы передаете 'self', который является указателем на объект, и объект нельзя манипулировать напрямую. Если вы хотите установить 'self' в качестве аргумента, вы должны передать' & self' вместо этого. – newacct

ответ

1

NSInvocation не доступен в Swift. Но в этом случае NSInvocation на самом деле не требуется. Мы знаем, как вы устанавливаете аргументы, которые вы всегда будете вызывать методом с двумя параметрами типа объекта-указателя. (Предполагая, что вы имели в виду &self вместо self для индекса 2.) Вы можете сделать это с помощью performSelector:withObject:withObject:.

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

Это доступно в Swift 2:

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

P.S. Это действительно странно, потому что кажется, что у вас есть другая версия метода, которая принимает обработчик завершения, который был бы идеальным для Swift, за исключением того, что тело кажется неполным, а тип обработчика завершения не прав, поскольку он не подходит возьмите запрос.