在Swift 3中如何编写完成处理程序?

33

我在想如何为我正在创建的Swift 3函数编写一个完成处理程序。

这是我在更新到Swift 3之前编写该函数的方式:

func Logout(completionHandler: (success: Bool) -> ()) {
    backendless.userService.logout(
        { ( user : AnyObject!) -> () in
            print("User logged out.")
            completionHandler(success: true)
        },
        error: { ( fault : Fault!) -> () in
            print("Server reported an error: \(fault)")
            completionHandler(success: false)
    })}

但是现在我无法确定目前有效的最佳方法。


请阅读以下网址的关于闭包的相关信息:https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html - Larme
2个回答

68

在 Swift 3 中,闭包中的函数参数标签已经被删除。

请移除所有 success: 并添加 @escaping 标签。

func Logout(completionHandler:@escaping (Bool) -> ()) {
    backendless?.userService.logout(
        { user in
            print("User logged out.")
            completionHandler(true)
        },
        error: { fault in
            print("Server reported an error: \(fault)")
            completionHandler(false)
    })
}

然后使用它

Logout() { success in
   print(success)
}

您是否知道为什么Swift 3中变量发生了变化?(另外,非常感谢!我回到电脑前会尝试一下。) - Noah G.
1
@bibscy 所有用作异步回调的闭包都是“逃逸闭包”。 - vadian
当成功参数名被移除后,我如何访问Bool值? - Tamil
@vadian 我有一个方法签名 getStatus(handler: &(Bool) -> Void)),我能够访问 bool,但是我得到了错误 cannot pass immutable value of type '(Bool) ->()' as inout argument。为什么会出现这个错误?在签名中的 & 是什么意思? - Tamil
@Tamil 请提出一个新问题并添加更多信息。 - vadian
显示剩余3条评论

0

在Swift 3中不需要包含参数名称。自动完成建议添加@escaping。

func Logout(completionHandler:@escaping (Bool) -> ()) {
    backendless?.userService.logout(
        {( user: Any?) -> (Void) in
            print("User logged out.")
            completionHandler(true)
        },
        error: { ( fault : Fault?) -> (Void) in
            print("Server reported an error: \(fault)")
            completionHandler(false)
    })
}

3
请解释您的答案,仅提供代码作为答案通常不会有太大的帮助。 - Jeet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接