指定完成处理程序的更短方法

Oll*_*lie 4 closures ios swift

我已经遇到过这个问题好几次了,所以我想我应该联系一下。

我有许多网络接口负责进行异步网络调用,每个接口中有大约 5/6 个函数,它们都使用具有相同定义的完成处理程序:

(success: Bool, resources: [String: AnyObject] -> Void)
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种替代方法,将其添加到每个函数的末尾,因为它强制每个函数声明到 2/3 行。例如

func performSomeNetworkCall(withThisParam parm1: AnyObject, param2: AnyObject, completion: (success: Bool, resources: [String: AnyObject] -> Void)) {

}
Run Code Online (Sandbox Code Playgroud)

关于如何解决长声明问题和重写每个函数的完成定义,我有一些想法。

想法一

使用 atypealias来定义闭包,如下所示:

typealias CompletionHandler = (success: Bool, resources: [String: AnyObject] -> Void)?
Run Code Online (Sandbox Code Playgroud)

从理论上讲,这可以解决这两个问题,因为它可以快速编写并解决代码长度问题。然而,当从外部源调用函数时,它typealias不会像常规闭包那样自动完成,这意味着您必须每次都将其写出来,从而导致错误。


想法二

使用代码片段(当 Xcode 实际上记住您设置它们时)。理论上这也是有效的,只要处理该代码的每个其他开发人员也具有相同的代码片段并且它知道它而不是编写整个声明。


想法三

我考虑将完成处理程序定义为函数并将该函数作为参数传递,如下所示:

func completionHandler() -> (success: Bool, resources: [String: AnyObject] -> Void) {
        return completionHandler()
    }
Run Code Online (Sandbox Code Playgroud)

但未能实现我想要的目标。



编辑

我希望通过想法三实现什么

func completionHandler() -> ((success: Bool, resources: [String: AnyObject]) -> Void) {
    return completionHandler()
}

func networkCall(completion: (success: Bool, resources: [String: AnyObject]) -> Void) {
    let request = NSURLRequest(URL: NSURL(string: "http://www.google.co.uk")!)

    let session = NSURLSession.sharedSession()

    session.dataTaskWithRequest(request) { (data, response, error) -> Void in
        let handler = completionHandler()
        handler(success: true, resources: [String: AnyObject]())
    }
}

func foo() {
    let handler = completionHandler()
    networkCall(handler)

    print(handler)
    // hope to use handler.success || handler.resources here
}
Run Code Online (Sandbox Code Playgroud)

虽然目前只是卡在completionHandler方法调用上 - (指出明显的......)

mcl*_*inj 5

Atypealias是典型的解决方案。即使在原始定义文件之外,它也应该自动完成。我认为问题在于你对你的定义typealias。如果你这样定义(注意括号,没有可选):

typealias CompletionHandler = (success: Bool, resources: [String: AnyObject]) -> Void

func performSomeNetworkCall(withThisParam parm1: AnyObject, param2: AnyObject, completion: CompletionHandler?) {
    // Implementation
}
Run Code Online (Sandbox Code Playgroud)

然后自动完成它的工作原理如下:

完成处理程序的自动完成

按回车键后:

扩展完成处理程序的自动完成功能