无法转换预期参数类型 GTLServiceCompletionHandler 的值
Posted
技术标签:
【中文标题】无法转换预期参数类型 GTLServiceCompletionHandler 的值【英文标题】:Cannot convert value of expected argument type GTLServiceCompletionHandler 【发布时间】:2016-10-11 17:17:30 【问题描述】:我使用 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 && 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
现在来自objective-c 的id
参数在swift3 中将具有Any
类型。
回到这个问题, 以前,如果 Objective-c 代码中的参数不具有可空性属性(如非空或可空),Swift 会将其转换为 !使它们成为非可选的(强制展开)。现在它用 ?使它们成为可选的。这就是你收到错误的原因。完成处理程序将变为:
func sendRequest() -> GTLServiceTicket?
if self.query != nil && 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】:感谢您的回答! 我试过了。以下两个代码正在工作。都需要添加“as Optional 'NSError'”和“as Optional 'AnyObject'”
1.
func sendRequest() -> GTLServiceTicket?
if self.query != nil && 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 && 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
【讨论】:
以上是关于无法转换预期参数类型 GTLServiceCompletionHandler 的值的主要内容,如果未能解决你的问题,请参考以下文章
无法转换类型“(_)-> Void?”的值到预期的参数类型'(() - > Void)?
无法转换预期参数类型 GTLServiceCompletionHandler 的值
Swift:无法将“NSDate”类型的值转换为预期的参数类型“NSDateComponents”