将函数void移动到布尔Swift

时间:2016-08-02 13:24:30

标签: ios swift

我是斯威夫特的新秀。我需要将以下方法更改为布尔函数,如果连接正确则返回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")
    }
}

5 个答案:

答案 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
})

希望这可能会有所帮助。