我是斯威夫特的新秀。我需要将以下方法更改为布尔函数,如果连接正确则返回true,否则返回false。感谢
func test() {
var configuration = SessionConfiguration()
configuration.host = "ftp://ftp.mozilla.org:21"
configuration.username = "optimus"
configuration.password = "rollout"
configuration.encoding = NSUTF8StringEncoding
_session = Session(configuration: configuration)
_session.list("/") {
(resources, error) -> Void in
println("List directory with result:\n\(resources), error: \(error)\n\n")
}
}
答案 0 :(得分:3)
由于_session.list("/")
有一个异步的回调,你可以这样做:
func test(_ completion: (Bool) -> Void) {
// ...
_session.list("/") { (resources, error) -> Void in
println("List directory with result:\n\(resources), error: \(error)\n\n")
guard error == nil else {
completion(false) // failed
return
}
completion(true) // succeed
}
}
所以你可以这样称呼它:
test() { (hasSucceeded: Bool) -> Void in
if hasSucceeded {
// Do what you want
} else {
// Failed
}
}
答案 1 :(得分:3)
很多人告诉你做什么,但是没有人能清楚地解释原因。
函数_session.list()是一个 async 函数。当你调用它时,它会在它甚至开始执行之前立即返回。代码在一个单独的线程上运行,一旦函数完成,就会调用传入的闭包。
因此,你不能让你的函数返回一个简单的bool。异步编程不会那样工作。
相反,您需要重构测试函数以使用bool参数进行闭包,如其他几个答案所述。 (例如,@ KevinHirsch的回答。)然后,当你调用你的测试函数时,你将检查代码,以检查测试是否通过或传递给你传递给测试函数的闭包。
答案 2 :(得分:0)
简单地做
public typealias SuccessClosure = (data: String) -> (Void)
public typealias FailureClosure = (error: NSError?, data: NSData? = nil, statusCode: Int? = nil) -> (Void)
func test(success: SuccessClosure, failure: FailureClosure) {
...
_session.list("/") { (resources, error) -> Void in
println("List directory with result:\n\(resources), error: \(error)\n\n")
if error != nil {
success("success")
} else {
failure(error)
}
}
}
更新: 我想你应该使用闭包,因为session.list是一个异步过程。正如@Duncan C在他的回答中所说_session.list()当你调用它时它立即返回,直到它甚至开始执行。代码在一个单独的线程上运行,一旦函数完成,就会调用传入的闭包。
{{1}}
答案 3 :(得分:0)
由于session.list
是一个async
进程,添加一个完成处理程序并调用您的函数,如下所示:
typealias theBool = (Bool) -> ()
func test(completion: theBool) {
//your code
_session.list("/") { (resources, error) in
guard error == nil else {
completion(false)
return
}
//your code
completion(true)
}
}
并称之为:
test { someVar in
if someVar {
//do stuff when it is true
}
else{
//do stuff if it is false
}
}
答案 4 :(得分:0)
同步代码:
func test() -> Bool {
return true
}
// Use case below:
let succes = test()
转向异步使用闭包:
func test(didTest didTest: (Bool)->Void) {
...
_session.list("/") { (resources, error) -> Void in
if error != nil {
didTest(false)
} else {
didTest(true)
}
}
}
// Use case below:
test(didTest: { result in
let succes = result
})
希望这可能会有所帮助。