在Swift中使用参数上下文之外的运算符函数

时间:2014-06-06 00:29:06

标签: swift

因此,在声明闭包时,我们可以得到相当抽象的东西。例如,我们可以使用内联闭包进行排序,如:

var arr = sort(["a", "b", "c"], { $0 > $1 }) // Shows ["c", "b", "a"]
arr

然后可以将其简化为这样的运算符函数:

var arr = sort(["a", "b", "c"], >) // Shows ["c", "b", "a"]
arr

由于:

  

Swift的String类型将其大于运算符(>)的字符串特定实现定义为具有两个String类型参数的函数,并返回Bool类型的值。这与sort函数的第二个参数所需的函数类型完全匹配。因此,您可以简单地传入大于运算符,Swift将推断您要使用其特定于字符串的实现

但是,我似乎无法在该论证的上下文之外找到一种方法。当它作为参数传递时,'>'几乎就像与'String'相关联的函数的名称。通过这种方式,我认为应该可以在参数的上下文之外进行分配。例如,有什么方法可以做到这一点:

var inlineClosure: (String, String) -> Bool = { > }

// or
var inlineClosure: (String, String) -> Bool = >

这纯粹是实验性的,我只是好奇,如果可能的话。

注意

这个问题不是关于如何以除运算符之外的任何方式分配内联闭包。我已经熟悉各种声明类型,包括速记参数和尾随闭包。我只是通过分配一个运营商来专门寻找一种方法。

4 个答案:

答案 0 :(得分:3)

你可以这样做:

let f : (String, String) -> Bool = (>)

答案 1 :(得分:0)

这似乎是Xcode的一个错误。你可以让它工作。像你一样输入整行:

var inlineClosure: (String, String) -> Bool = { > }

然后删除并重新键入运算符。由于某些原因,解析器可以理解您尝试做的事情。

答案 2 :(得分:0)

喜欢这个吗?

var inlineClosure: (String, String) -> Bool = { $0 > $1 }

答案 3 :(得分:0)

inlineClosure分配一个实际的闭包:

  7> var inlineClosure = { (a:String, b:String) -> Bool in return a > b }
inlineClosure: (String, String) -> Bool =
  8> inlineClosure ("a", "b")
$R3: Bool = false
  9> inlineClosure ("c", "b")
$R4: Bool = true

顺便说一句,对于一个以闭包作为最后一个参数的方法,有一种特殊的语法:

var answer = sort ([1,3,2]) { (a:Int, b:Int) -> Bool in return a < b }

方便。