从Swift中的Block返回布尔值

Alp*_*ven 3 boolean objective-c-blocks swift completion

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

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

我用的时候:

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

我得到错误"Bool不能转换为Void"这是有道理的.

所以,如果我将第3行更改为:

(user,error) -> Bool in
Run Code Online (Sandbox Code Playgroud)

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

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

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

Mob*_*Ben 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
}
Run Code Online (Sandbox Code Playgroud)

但是,根据您的代码,您想要做的是:

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

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

authenticateUser(){
    result in
    if result {
        println("Authenticated")
    } else {
        println("Not authenticated")
    }
}
Run Code Online (Sandbox Code Playgroud)

要么

authenticateUser({
  result in
    if result {
        println("Authenticated")
    } else {
        println("Not authenticated")
    }
})
Run Code Online (Sandbox Code Playgroud)

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

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

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