1

我用 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
}
4

2 回答 2

0

谢谢您的回答!我试过了。以下两个代码正在工作。都需要添加“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
}
于 2016-10-20T17:33:14.927 回答
0

如果您跳转到#Swift 3.0 #Xcode 8,您需要对代码进行一些更改

要记住的事情:-

  • NS 已从大多数地方删除,例如NSError已成为Error

  • 现在id来自objective-c的参数也将具有Anyswift3的类型。

所以回到这个问题,以前,如果 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 }

于 2016-10-19T07:20:44.553 回答