【问题标题】:Swift 3 ClosureSwift 3 关闭
【发布时间】:2017-03-10 22:06:31
【问题描述】:

在 Swift 3 中,我可以在尾随闭包中使用特定于字符串的实现吗?

let names = ["Ekram","Galib","Hasan","Rangon","Asif","Saikat"]

let reversedName = names.sorted{ > }

【问题讨论】:

    标签: swift closures


    【解决方案1】:

    为什么将> 包裹在尾随闭包中? sorted(by:) 接受一个函数,> 已经匹配它的签名。所以就这样做吧:

    let reversedName = names.sorted(by: >)
    

    只是陈述一些不明显的事情:

    a) Swift 中的操作符像常规函数一样工作,例如在这种情况下,就像func > <T>(lhs: T, rhs: T) -> Bool

    b) 在 Swift 中,函数被命名为闭包,如果 API 需要闭包(如 (lhs: T, rhs: T) -> Bool),您也可以使用命名函数,如 >func compareTheTwo(a: String, b: String) -> Bool

    【讨论】:

    • 闭包不是匿名函数——函数被命名为闭包。
    • 如果您挑剔,请准确地说:functions are named closures IN SWIFT ;-)
    • @hnh 好吧,我认为上下文就足够了;)
    • 我怀疑很多上下文是否足以理解您所说的,即匿名函数和闭包之间的区别是什么。顺便说一句,鉴于 Swift 也可以调用纯函数(如 strcmp 或不捕获的 Swift 全局函数),您的陈述也不完全正确。我认为适当的声明更像是:声明一个回调入口点的 Swift 函数,如 ( String, String ) -> Void 接受所有、闭包、方法或函数。不过,所有这些都与原始问题无关。
    • @hnh 哦,我们在这里打开了一罐蠕虫 :) 在 Swift 中,闭包并不意味着捕获的东西——它只是意味着一个自包含的代码块 可以从封闭范围捕获变量,无论其纯度如何。函数是命名的闭包,闭包表达式(使用花括号内联创建闭包)是匿名闭包。我同意这很令人困惑,尤其是当这些定义与其他语言的定义相冲突时——我同意你的观点,可能会在我的第一条评论上扩展一点,我希望这条评论现在已经完成了。
    【解决方案2】:

    是的,但您必须指定实际比较的参数:

    let reversedNames = names.sorted { $0 > $1 }
    

    【讨论】:

    • names.sorted(by: >)
    猜你喜欢
    • 1970-01-01
    • 2017-02-21
    • 2017-06-05
    • 2017-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-16
    • 2018-11-06
    相关资源
    最近更新 更多