Не удается преобразовать значение ожидаемого типа аргумента GTLServiceCompletionHandler

#ios #google-app-engine #swift3 #swift2.3

#iOS #google-app-engine #swift3 #swift2

Вопрос:

Я написал свое приложение в Swift 2.3.Используя Google Cloud AppEngine. Теперь я обновился до xCode8.0, и мне нужно преобразовать мое приложение в Swift 3.0. Следующий код верен в Swift 2.3. Но он неверен в Swift 3.0. Любая помощь будет оценена! проблема: не удается преобразовать значение типа ‘(GTLServiceTicket!, GTLObject!, NSError!) -> Void’ в ожидаемый тип аргумента ‘GTLServiceCompletionHandler!’

 func sendRequest() -> GTLServiceTicket? {
    if self.query != nil amp;amp; shouldSend {
        self.ticket = appService.executeQuery(query!, completionHandler: {
            (ticket: GTLServiceTicket!, object: AnyObject!, error: NSError!) -> Void in
            if error != nil {
                for handler in self.onFailure {
                    handler(ticket, error)
                }
            } else {
                for handler in self.onSuccess {
                    handler(ticket, object)
                }
            }
        })
    }
    return ticket
}
  

Ответ №1:

Вам необходимо внести некоторые изменения в свой код, особенно если вы переходите на #Swift 3.0 #Xcode 8

что нужно помнить :-

  • NS удаляется из большинства мест, например NSError , стал Error

  • Также теперь id параметр из objective-c будет иметь тип Any в swift3.

Итак, возвращаясь к вопросу, ранее, если параметры в коде objective-c не имели атрибутов обнуляемости (например, nonnull или nullable), Swift преобразует его с помощью! что делает их необязательными (принудительное разворачивание). Теперь он преобразует его с помощью? делает их необязательными. Вот почему вы получаете сообщение об ошибке. Обработчик завершения станет :

func sendRequest() -> GTLServiceTicket? {
if self.query != nil amp;amp; shouldSend {
self.ticket = appService.executeQuery(query!, completionHandler: {
(ticket: GTLServiceTicket?, object: Any?, error: Error?) -> Void in
if error != nil {
for handler in self.onFailure {
handler(ticket, error)
}
} else {
for handler in self.onSuccess {
handler(ticket, object)
}
}
})
}
return ticket
}

Ответ №2:

Спасибо за ваш ответ! Я пробовал. Следующие два кода работают. Всем нужно добавить «как необязательный ‘NSError'» и «как необязательный ‘AnyObject'»

1.

 func sendRequest() -> GTLServiceTicket? {
    if self.query != nil amp;amp; shouldSend {
        self.ticket = appService.executeQuery(query!, completionHandler: {
            (ticket: GTLServiceTicket?, object: Any?, error: Error?) -> Void in
            if error != nil {
                for handler in self.onFailure {
                    handler(ticket, error as Optional<NSError>)
                }
            } else {
                for handler in self.onSuccess {
                    handler(ticket, object as Optional<AnyObject>)
                }
            }
        })
    }
    return ticket
}
  

2.

 func sendRequest() -> GTLServiceTicket? {
    if self.query != nil amp;amp; shouldSend {
        self.ticket = appService.executeQuery(query!) { ticket, object, error in
            if error != nil {
                for handler in self.onFailure {
                    handler(ticket, error as Optional<NSError>)
                }
            } else {
                for handler in self.onSuccess {
                    handler(ticket, object as Optional<AnyObject>)
                }
            }
        }
    }
    return ticket
}