无法转换预期参数类型 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”

无法将类型 '(Any) -> ()' 的值转换为预期的参数类型 '(_) -> _'

无法将“()”类型的值转换为预期的参数类型“(() -> Void)?”在 swiftui