swift中是否特别使用了闭包?什么是好处?

时间:2016-11-21 06:59:46

标签: swift closures

我已经学习了一段时间的Swift,并且我已经阅读了Swift语言指南。

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html#//apple_ref/doc/uid/TP40014097-CH11-ID94

概念封闭对我来说是新的。我想我可以理解如何使用它,但我可以在哪里使用它?它有什么好处?

我用Google搜索并得到答案When to use closures in swift?

我认为答案并不令人满意。语言指南写了很多关于它的内容,我想这是该语言的一个非常重要的特性,也许它在框架中被广泛使用。

有人能告诉我更多的例子来展示它的力量吗? 非常感谢。

2 个答案:

答案 0 :(得分:3)

问题可能有点宽泛,但我会试着回顾一下。

参考Documentation

  

闭包是可以传递的自包含功能块   在您的代码中使用。

当你想将一大块代码作为参数传递给你想要异步执行它的方法时,你应该使用closure。

为了简化 - 通过给出一个真实世界的例子 - 想象有一种方法负责扫描用户的照片,所以该方法应该返回一组照片和另一组视频: / p>

04-0030-03代码:

// the method should scan the the user's photos and return them after fetching is finished

// the 'completion' (success) closure should returns two arrays
// what if there is something wrong happened? another closure should returns an error

// for the example purposes they are arrays of strings, the error is also a string
func scanPhotos( completion: @escaping (_ photos: [String], _ videos: [String]) -> (), failure: @escaping (String) -> ()) {
    // imagine that the scanning has been successfully done and you filled the two arrays:

    //if scanningSuccess {
        let fetchedPhotos = [String]()
        let fetchedVideos = [String]()

        completion(fetchedPhotos, fetchedVideos)
    //} else {
        // if something goes wrong
        failure("the error!!")
    //}
}

调用方法:

scanPhotos(completion: { (photos, videos) in
    // now you can use the fetched photos and videos
}, failure: { error in
    // display an alert -for example- based on the error is saying...
})

请注意,扫描过程应该异步执行,完成后,应执行两个块之一(成功或失败)。

一些与clousres一起使用的流行方法

AGAIN :这只是闭包的简单用法;您需要查看文档以获取更多详细信息。

我希望它有所帮助。

答案 1 :(得分:1)

闭包是一个主要用于异步函数调用的概念。 (至少我这样做了)

Apple使用闭包的一个很好的例子是URLSession

func downloadTask(with url: URL, completionHandler: @escaping (URL?, URLResponse?, Error?) -> Void) -> URLSessionDownloadTask

此方法创建一个在后台线程中运行的URLSessionDownloadTask。当您调用此方法时,您将传递一个闭包completionHandler。任务完成后执行此闭包。

还有一些其他情况,但我还没有使用过它们,因为我喜欢委托模式。我找到了一个article来比较Swift中的Closures和Delegates。

Swift中的代表有一个大问题:除非您使用@objc,否则必须实现protocol每种方法,这可能会导致大量不必要的代码而且会让人感到困惑。这就是为什么我想在很多情况下使用闭包会好得多。