Swift 的闭包为什么选用 in 关键字

高手们哪位知道,Swift 的闭包为什么选用 in 关键字
最新回答
孤独儛埗

2024-10-13 12:14:55

作者:黄兢成
链接:
https://www.zhihu.com/question/53539254/answer/135427978

来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Swift 选择 in 作为闭包中的关键字,肯定有一定理由,但外人无法知道,只能揣摩。in 作为一个分隔符号,分开闭包参数和闭包体。就算换掉 in,还是需要一定方法识别出参数和闭包体。为了容易输入,代码符号采用 ASCII 字符,你不能选择 → 这样的箭头符号。因此箭头符号就会选择 -> 或者 => 。其中 -> 符号在 Swift 中已经被使用了,表示闭包的返回值。(函数可以看作闭包的特殊形式)。而使用 =>,闭包就会写成,array.sort { a, b => a > b }
这种写法也可以,只是跟 in 相比,并没有太大改进。而 => 跟 -> 还是有点相似的,当参数类型也是闭包时,看起来就容易混淆。闭包使用 in 作为关键字,表达了这层意思:参数在(in)闭包体中使用。在 for 循环中,也使用 in 作为关键字for a in [1, 2, 3, 4, 5] {
}
这样闭包中使用 in 作为关键字,在没有歧义的情况下,使得关键字可以复用。一旦选取了某个关键字,日常编程就不能直接用这个单词作为名字了。在没有歧义的情况下,关键字应该越少越好。前面提过,其实只需要有方法分开闭包参数和闭包体就行了。不同的语言会采用不同的方式。比如[](int a, int b) { return a > b; } // C++

^(int b, int b) { return a > b; } // Objective-C

(int a, int b) => { return a > b; } // C#

func(a int, b int) { return a > b } // Go

lambda { |a, b| return a > b } // Ruby

lambda a, b: a > b // Python
Swift 支持尾随闭包,当闭包是函数的最后参数,可以将大括号 {} 提出来,省略掉圆括号()。这种形式跟 Ruby 最接近。将 Ruby 的 |a, b | 换成 a, b in,就变成了 Swift 的写法了。