2016-08-21 4 views
2

Итак, я создал typealias для хранения обработчика завершения, чтобы позже перейти к функции, называемой submitTokenToBackend, используя библиотеку iOS от Stripe. Вот мой код:Ожидаемый тип до/после ->, ожидаемая декларация в Swift 3

// MARK: - Create Completion Handlers 

typealias CompletionHandler = (_ token: AnyObject?, _ error: NSError?) -> Void 

// MARK: - Submit Token To Backend 

func submitTokenToBackend(completionHandler: CompletionHandler) { 

} 

// MARK: - STPPaymentCardTextFieldDelegate 


func paymentCardTextFieldDidChange(_ textField: STPPaymentCardTextField) { 
    print("Card number: \(textField.cardParams.number) Exp Month: \(textField.cardParams.expMonth) Exp Year: \(textField.cardParams.expYear) CVC: \(textField.cardParams.cvc)") 
    self.buyButton.isEnabled = textField.isValid 
} 

// MARK: Initialize Card Params 

let cardParams = STPCardParams() 

func cardParamsFunc() { 
    cardParams.number = "4242424242424242" 
    cardParams.expMonth = 10 
    cardParams.expYear = 2018 
    cardParams.cvc = "123" 
    STPAPIClient.shared().createToken(withCard: cardParams){ (token, error) in 

     if let error = error { 
      print(error.localizedDescription) 

     } else if let token = token { 

// HERE'S WHERE I'M GETTING ERRORS 

      self.submitTokenToBackend(completionHandler: CompletionHandler) -> Void { 
       if let error = error { 
      print(error.localizedDescription) 
       } else { 
        print("Show receipt page") 
      } 
     } 
    } 
} 
} 

Я получаю эти странные ошибки, то теперь, в Swift 3 относительно мой обработчик завершения, не имея ожидаемых типов. Не обособленный инцидент. Есть предположения?

ответ

0
self.submitTokenToBackend(completionHandler: CompletionHandler) -> Void { 

Это объявление, а не вызов метода. Вы не можете передать типализм в качестве параметра. И -> Void здесь вообще не имеет смысла. Вы почти наверняка означало

self.submitTokenToBackend { 

Если у вас есть дополнительные вопросы по этому поводу, однако, вам необходимо предоставить код, который мы можем компилировать (см mcve) и перечислить точные ошибки. «Незначительные ошибки» не особенно полезны для отладки.

+0

Привет Роб. Функция submitTokenToBackend с обработчиком завершения принимает аргумент обработчика завершения, объявленные ранее типы сообщений ** typealias CompletionHandler = (_ токен: AnyObject ?, _ error: NSError?) -> Void ** Что я должен пройти, если не Обработчик завершения? Аргументы тоталий? Разве это не победит? –

+0

Просто делать ** self.submitTokenToBackend {** вызывает исключение ** Контекстный тип для списка аргументов закрытия ожидает 2 аргумента, которые не могут быть неявно проигнорированы ** с исправлением ** _, _ in **, что приводит к ошибкам * * Последовательные утверждения на строке должны быть разделены символом «;» ** и ** Ожидаемое выражение ** –

0

Im не уверен, но ... Где реализация «CompletionHandler»? Насколько я понимаю, вы просто объявляете какой-то блок в Objective-C ('typedef void (^ completeHandler) (id-токен);'), но не используйте его.

+0

@OOper Да. Я как раз собирался принять ответ Роба Напира. Я ничего не делал с обработчиком и не понял его самостоятельно, понимая, что я объявил обработчика, не передавая ничего. Не уверен, правильно ли я это сказал, но использовал закрывающее закрытие, и я получил его работу! Всем спасибо! –

1

Почти все, что вам нужно, описано в ответе Роба Напира.

Я попытаюсь показать вам немного более конкретный код ...

Вы можете определить обработчик завершения и передать его submitTokenToBackend(completionHandler:) так:

  let theCompletionHandler: CompletionHandler = {token, error in 
       if let error = error { 
        print(error.localizedDescription) 
       } else { 
        print("Show receipt page") 
       } 
      } 
      self.submitTokenToBackend(completionHandler: theCompletionHandler) 

С удалением промежуточного пусть постоянной , вы можете написать его таким образом:

  self.submitTokenToBackend(completionHandler: {token, error in 
       if let error = error { 
        print(error.localizedDescription) 
       } else { 
        print("Show receipt page") 
       } 
      }) 

Использование закрытия задней особенность Swift, приведенный выше код может быть сокращен до:

  self.submitTokenToBackend {token, error in 
       if let error = error { 
        print(error.localizedDescription) 
       } else { 
        print("Show receipt page") 
       } 
      } 

Ваш код далек от любого из трех.