Синтаксис Swift Block с функцией Objective-C [Venmo-iOS-SDK]

В настоящее время я пытаюсь использовать Venmo-iOS-SDK для приложения, над которым я работаю. SDK находится в объекте C, а я пытаюсь использовать его с быстрым приложением.

У меня проблемы с переводом синтаксиса блока завершения obj-c на быстрый. Я нашел образец кода, реализующий функцию, которую хочу использовать.

- (IBAction)logInButtonAction:(id)sender { 
  [[Venmo sharedInstance] requestPermissions:@[VENPermissionMakePayments,
                                             VENPermissionAccessProfile]
                     withCompletionHandler:^(BOOL success, NSError *error) {
                         if (success) {
                             NSLog("Success")
                         } else {
                             NSLog("Failure")
                     }
 }];
}

Я пробовал сделать это

@IBAction func loginButtonAction(sender: AnyObject){
    Venmo.sharedInstance().requestPermissions([VENPermissionMakePayments, VENPermissionAccessPhone], withCompletionHandler: { (success: Bool, error: NSErrorPointer) -> Void in
        if success{
            println("Yes")
        }else{
            println("No")
        }
    })
}

Но получите ошибку

«Невозможно вызвать 'requestsPermissions со списком аргументов типа' ([String], withCompletionHandler: (Bool, NSError) -> Void)»

Это проблема с тем, как я перевожу блок? Или что-то другое. Глядя на Venmo-SDK, функции obj-C определены следующим образом

- (void)requestPermissions:(NSArray *)permissions withCompletionHandler:(VENOAuthCompletionHandler)handler;

и

- (void)requestPermissions:(NSArray *)permissions withCompletionHandler:(VENOAuthCompletionHandler)handler;

person user3011685    schedule 08.12.2015    source источник


Ответы (1)


Вы можете написать это так (обратите внимание на отсутствие типов в параметрах обработчика завершения):

@IBAction func loginButtonAction(sender: AnyObject) {
    Venmo.sharedInstance().requestPermissions([VENPermissionMakePayments, VENPermissionAccessPhone], withCompletionHandler: { (success, error) -> Void in
        // code here
    })
}

Немного более кратким синтаксисом Swift 2 было бы опущение -> Void и явного withCompletionHandler: параметра:

@IBAction func loginButtonAction(sender: AnyObject) {
    Venmo.sharedInstance().requestPermissions([VENPermissionMakePayments, VENPermissionAccessPhone]) { (success, error) in
        // code here
    }
}

Вы также захотите убедиться, что вы изменили свои println операторы на print.

person Kai Schaller    schedule 08.12.2015