void函数Swift 4中的意外非void返回值
Posted
技术标签:
【中文标题】void函数Swift 4中的意外非void返回值【英文标题】:unexpected non-void return value in void function Swift 4 【发布时间】:2018-03-27 17:39:43 【问题描述】:我试图从 ECPLogin 中的 switch 语句返回响应正文,但它给了我这个错误“unexpected non-void return value in void”,即使我在第 33 行声明了函数 gotourl() -> String。请指教.
这是我的代码
import UIKit
import SwiftECP
import XCGLogger
class ViewController: UIViewController
@IBOutlet var UsernameField: UITextField!
@IBOutlet var passwordField: UITextField!
override func viewDidLoad()
super.viewDidLoad()
@IBAction func _Login(_ sender: Any)
self.gotourl()
// performSegue(withIdentifier: "gotowelcome", sender: self)
override func didReceiveMemoryWarning()
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
func gotourl() -> String
let username: String = UsernameField.text!
let password: String = passwordField.text!
let protectedURL = URL(
string: "https://itsapps.odu.edu/auth/getInfo.p"
)!
let logger = XCGLogger()
logger.setup(level: .debug)
ECPLogin(
protectedURL: protectedURL,
username: username,
password: password,
logger: logger
).start event in
switch event
case let .value( body) :
// If the request was successful, the protected resource will
// be available in 'body'. Make sure to implement a mechanism to
// detect authorization timeouts.
print("Response body: \(body)")
return body
// The Shibboleth auth cookie is now stored in the sharedHTTPCookieStorage.
// Attach this cookie to subsequent requests to protected resources.
// You can access the cookie with the following code:
if let cookies = HTTPCookieStorage.shared.cookies
let shibCookie = cookies.filter (cookie: HTTPCookie) in
cookie.name.range(of: "shibsession") != nil
[0]
print(shibCookie)
case let .failed(error):
// This is an AnyError that wraps the error thrown.
// This can help diagnose problems with your SP, your IdP, or even this library :)
switch error.cause
case let ecpError as ECPError:
// Error with ECP
// User-friendly error message
print(ecpError.userMessage)
// Technical/debug error message
print(ecpError.description)
case let alamofireRACError as AlamofireRACError:
// Error with the networking layer
print(alamofireRACError.description)
default:
print("Unknown error!")
print(error)
default:
break
我要返回的这部分
case let .value( body) :
// If the request was successful, the protected resource will
// be available in 'body'. Make sure to implement a mechanism to
// detect authorization timeouts.
print("Response body: \(body)")
return body
那么有办法解决吗?谢谢
【问题讨论】:
【参考方案1】:return
没有从gotourl()
返回。它从您传递给ECPLogin
的闭包中返回。从您的代码和错误消息看来,您调用的方法将完成闭包作为其最后一个参数,并且此闭包不应返回值(即,它返回Void
)。这就是你得到错误的原因——当这个闭包应该什么都不返回时,你正在返回一个字符串。看起来您正在使用的 ECPLogin
函数是异步的,这意味着它不会立即产生结果,而是会做一些工作并在完成后调用闭包。
您的代码没有从gotourl()
返回任何内容,这将是另一个与此相关的问题。
如何修复它取决于您的应用需要如何工作。一些选项包括:
更改gotourl()
,使其采用完成闭包而不是返回值。然后用调用此闭包的 lint 替换您的 return
。
使用诸如调度组之类的东西让您的代码等到ECPLogin
调用完成,然后以这种方式返回一个值。
使用其他选项,这样您就无需等待字符串可用,例如发布通知。
【讨论】:
感谢您的回复,我正在尝试完成关闭,但我是新手,可能无法做到。你介意根据上面的代码给出例子吗?谢谢 我想要实现的是从ECPlogin获取返回页面。以上是关于void函数Swift 4中的意外非void返回值的主要内容,如果未能解决你的问题,请参考以下文章
Swift 1.2:void 函数中出现意外的非 void 返回值
新 Swift 类的 void 函数中出现意外的非 void 返回值
类理解:void函数中出现意外的非void返回值(swift 3)