我已经学习了一段时间的Swift,并且我已经阅读了Swift语言指南。
概念封闭对我来说是新的。我想我可以理解如何使用它,但我可以在哪里使用它?它有什么好处?
我用Google搜索并得到答案When to use closures in swift?
我认为答案并不令人满意。语言指南写了很多关于它的内容,我想这是该语言的一个非常重要的特性,也许它在框架中被广泛使用。
有人能告诉我更多的例子来展示它的力量吗? 非常感谢。
答案 0 :(得分:3)
问题可能有点宽泛,但我会试着回顾一下。
闭包是可以传递的自包含功能块 在您的代码中使用。
当你想将一大块代码作为参数传递给你想要异步执行它的方法时,你应该使用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
的每种方法,这可能会导致大量不必要的代码而且会让人感到困惑。这就是为什么我想在很多情况下使用闭包会好得多。