Swift 尾随闭包

问题:为什么map代码提示中跟的是(),但是使用时跟的是{} ?

虽然一直知道尾随闭包,但有时还真反应不过来!

   var sessions: [ConnectingSession] {
        let shellSessions = shellManager.sessions.map { $0 as ConnectingSession }
        let sftpSessions = sftpManager.sessions.map { $0 as ConnectingSession }
        return (shellSessions + sftpSessions).sorted { $0.createdAt < $1.createdAt }
    }
    
    var servers: [ServerInfo] {
        sessions.map { $0.server }
    } 

map 的函数原型是 map(_ transform: (Element) throws -> T) rethrows -> [T],签名里参数表用的是 (),因为它定义为“接受一个参数叫 transform”。但 transform 自身的类型是 (Element) -> T,即一个闭包。

Swift 在调用时有两种写法:

  • 标准写法:函数名后面括号包住所有参数,闭包参数也写在括号里:
    sessions.map({ session in return session.server })

  • 尾随闭包(Trailing Closure):如果最后一个参数是闭包,可以将闭包移到括号外,并用 {} 表达:
    sessions.map { $0.server }

IDE 提示展示的是通用函数签名(括号形式),实际使用时为了简洁可以用尾随闭包语法写成 {},两者等价。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容