Swift闭包遗漏的例子?

时间:2017-05-31 08:05:11

标签: swift

当我阅读Apple提供的Swift文档时,我发现一些概念对我来说并不清楚......

  

当已知闭包的类型时,例如委托的回调,您可以省略其参数的类型,返回类型或两者。单个语句闭包隐式返回其唯一语句的值。

let mappedNumbers = numbers.map({ number in 3 * number })
print(mappedNumbers)

代表回调意味着什么?你能举个例子吗?如果两者都省略,我们是否需要in关键字?

2 个答案:

答案 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(<)

每个步骤输出相同的结果,您可以决定什么是简洁的,但同时可读。