从Swift中的Block返回布尔值

时间:2014-12-03 05:45:34

标签: swift boolean objective-c-blocks completion

我正在尝试使用Swift编写的Parse。我能够毫无困难地登录,但我正在努力告诉我的应用程序用户已登录。

我正在使用 logInWithUsernameInBackground ,如果登录成功,我只想返回一个布尔值。

当我使用时:

func authenticateUser() -> Bool{
    PFUser.logInWithUsernameInBackground(userName.text, password: passwordField.text, block: {
        (user,error) in
        return error === nil
    })
}

我得到错误“Bool不能转换为Void”这是有道理的。

因此,如果我将第3行更改为:

(user,error) -> Bool in

我最终得到错误“在调用中缺少参数选择器的参数”

但是,此方法不需要选择器参数。

那我哪里错了?如何根据登录时是否有错误返回bool?

1 个答案:

答案 0 :(得分:6)

根据您编写的代码,如果您想返回Bool,您可以这样做:

func authenticateUser() -> Bool{
    PFUser.logInWithUsernameInBackground(userName.text, password: passwordField.text, block: {
        (user,error) in
        return error === nil
    })

    return true // This is where the bool is returned
}

但是,根据您的代码,您要执行的操作是:

func authenticateUser(completion:(Bool) -> ()) {
    PFUser.logInWithUsernameInBackground(userName.text, password: passwordField.text, block: {
        (user,error) in
        completion(error === nil)
    })
}

您可以通过以下方式之一调用此呼叫:

authenticateUser(){
    result in
    if result {
        println("Authenticated")
    } else {
        println("Not authenticated")
    }
}

authenticateUser({
  result in
    if result {
        println("Authenticated")
    } else {
        println("Not authenticated")
    }
})

第一个是速记,在关闭之前有其他参数时更方便。

这意味着您将收回您的Bool,以确定您是否异步验证。

顺便说一下,你真的只需要做error == nil