Home Articles

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

Asked
Viewed 1275 times
3

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

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 Answers

  • 3

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

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

    然后删除并重新键入运算符 . 出于某种原因,解析器可以理解您要执行的操作 .

  • 0

    你可以这样做:

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

    像这样?

    var inlineClosure: (String, String) -> Bool = { $0 > $1 }
    
  • 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 }
    

    方便的 .

Related