问题:为什么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 提示展示的是通用函数签名(括号形式),实际使用时为了简洁可以用尾随闭包语法写成 {},两者等价。