当我阅读Apple提供的Swift文档时,我发现一些概念对我来说并不清楚......
当已知闭包的类型时,例如委托的回调,您可以省略其参数的类型,返回类型或两者。单个语句闭包隐式返回其唯一语句的值。
let mappedNumbers = numbers.map({ number in 3 * number })
print(mappedNumbers)
代表回调意味着什么?你能举个例子吗?如果两者都省略,我们是否需要in
关键字?
答案 0 :(得分:1)
没有比这更简单的了。在这种情况下,delegate
的含义是闭包用作变量。请考虑以下示例:
class Downloader {
var onDownloaded: ((Data) -> Void)?
func startDownloading() {
...
}
}
用作:
let downloader = Downloader()
downloader.onDownloaded = { data in
print("Downloaded: \(data.count) B")
}
downloader.startDownloading()
如您所见,我没有在闭包中指定类型或返回值,因为表达式(.onDownloaded =
)的左侧提供了它们。
同样适用于方法参数:
func startDownloading(onDownloaded: ((Data) -> Void)?) {
...
}
但是,在闭包中我们仍然需要in
。关键字将参数名称与闭包体分开。当然,我们可以使参数匿名:
downloader.onDownloaded = {
print("Downloaded: \($0.count) B")
}
答案 1 :(得分:1)
它声明可以从委托中推断出参数类型。委托是一种协议,您可以在其中定义方法参数的类型。这意味着在实现委托方法时,编译器已经通过声明的协议了解方法类型。
一个例子:
let sortedAnimals = animals.sort { (one: String, two: String) -> Bool in
return one < two
}
第一个简化与参数有关。类型推断系统可以计算闭包中参数的类型:
let sortedAnimals = animals.sort { (one, two) -> Bool in return one < two }
也可以推断出返回类型:
let sortedAnimals = animals.sort { (one, two) in return one < two }
$ i表示法可以替换参数名称:
let sortedAnimals = animals.sort { return $0 < $1 }
在单个语句闭包中,可以省略return关键字:
let sortedAnimals = animals.sort { $0 < $1 }
对于字符串,有一个比较函数,它使字符串比较更短:
let sortedAnimals = animals.sort(<)
每个步骤输出相同的结果,您可以决定什么是简洁的,但同时可读。