因此,在声明闭包时,我们可以得到相当抽象的东西。例如,我们可以使用内联闭包进行排序,如:
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 = >
这纯粹是实验性的,我只是好奇,如果可能的话。
这个问题不是关于如何以除运算符之外的任何方式分配内联闭包。我已经熟悉各种声明类型,包括速记参数和尾随闭包。我只是通过分配一个运营商来专门寻找一种方法。
答案 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 }
方便。