无法转换预期参数类型 GTLServiceCompletionHandler 的值
Cannot convert value of expected argument type GTLServiceCompletionHandler
我在 Swift 2.3.Using 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
}
如果您跳转到#Swift 3.0 #Xcode 8
,您需要对您的代码做一些特别的更改
要记住的事情:-
NS 已从大多数地方删除
例如 NSError
变成了 Error
现在 objective-c 中的 id
参数在 swift3 中的类型为 Any
。
所以回到这个问题,
以前,如果 objective-c 代码中的参数没有可空性属性(如 nonnull 或 nullable),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
}
感谢您的回答!
我试过了。以下两个代码正在运行。都需要加上"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
}
我在 Swift 2.3.Using 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
}
如果您跳转到#Swift 3.0 #Xcode 8
,您需要对您的代码做一些特别的更改要记住的事情:-
NS 已从大多数地方删除 例如
NSError
变成了Error
现在 objective-c 中的
id
参数在 swift3 中的类型为Any
。
所以回到这个问题, 以前,如果 objective-c 代码中的参数没有可空性属性(如 nonnull 或 nullable),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
}
感谢您的回答! 我试过了。以下两个代码正在运行。都需要加上"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
}