#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
}