ios - Swift 3 中的闭包速记语法

标签 ios functional-programming closures swift3

从编译器的角度来看,表达式 1 和 2 之间有什么区别(参见下面的代码片段)?如果从 Swift 3 开始就不可能再以元组的形式将多个参数传递给函数,那么为什么第一个表达式仍然有效?

func f(_ x: Int, _ y: Int) -> Int {
    return x + y
}

// expression 1: compiles
[(1, 2)].map(f)

// expression 2: doesn't compile "Passing 2 arguments to a callee as a single tuple value has been removed in Swift 3"
[(1, 2)].map { (t: (Int, Int)) -> Int in
    return f(t)
}

最佳答案

基本原理在 proposal that removed it 中解释。 .它在第二种情况下造成了微妙的问题,但在第一种情况下却没有。而且,对于大多数“为什么编译器不在这里抛出错误”的情况,答案是“因为它没有阻止它”。这并不总是意味着工作中有深刻的意图。有时它可以工作,因为它没有被阻止工作。

但是,这实际上并不是第一个示例中的特例。这也适用于标签:

func f(x: Int, y: Int) -> Int { ... }
[(1, 2)].map(f)

在第二个示例中,它过去不起作用,因为它遇到了元组标签不是类型的一部分的事实,因此目前没有正确表达它的方法(这是其中之一细微的问题)。见:

需要注意的是,这是函数式语言中常见的特性,但 Swift 不是函数式语言,也不打算成为函数式语言,并且已经移除了 Swift 3 中已有的几个函数式特性,使语言更加连贯(最著名的是 curry 语法,它也确实与 Swift 的工作方式背道而驰)。您定义 f() 的方式非常不像 Swift,既是顶级函数(Swift 避免的)又没有命名其参数。 Swift 允许这样的事情,但不迎合它们。 Swift 团队急于听到这种语法在哪些地方有用的示例,以及映射到 Swift 开发人员可能遇到的常见问题的示例(他们表示,如果出现此类示例,他们将探索更全面地重新添加该功能)。如果您有示例,请参阅讨论帖的 evo-proposal。

从广义上讲,Swift 中的元组是弱酱。它们并不像您所期望的那样成为真正的“匿名结构”,并且几乎不是一流的类型(例如,您不能将扩展附加到它们)。有几个改进元组的提议,但在 Swift 3 中,除了非常简单的用途之外,它们并不是真正非常强大的工具。

关于ios - Swift 3 中的闭包速记语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40413398/

相关文章:

ios - 在 Parse 中注册后发生错误时如何更改警报消息?

functional-programming - 用函数式语言生成所有排列

iphone - 处理 Objective-C 中缺少闭包的问题

xcode - 嵌套函数中首先执行的是什么?

ios - 如何在 iOS 核心数据中随机执行 SORT_BY 或 ORDER_BY?

ios - iOS 11 中的 VOIP Sinch 无法在后台运行

functional-programming - 原始函数式语言中的 MapReduce 的可扩展性如何?

javascript - 在 Javascript 的闭包中处理 'this' 的更好方法?

ios - 我正在检索所有联系人列表。然而它在 iPhone 5 中工作正常但在 iPhone 5s 中崩溃

list - 使用 Mathematica 中的函数式编程计算列表中元素之间的百分比差异?