Swift 5.2
的新功能之一:能够将 KeyPaths
用作函数。如果您只在闭包中返回某个 KeyPath
的值,这将非常有用。
在 Swift 5.2 之前:
代码语言:javascript复制struct Student {
let id: Int
let name: String
let age: Int
let grade: Double
}
func getStudentsName(from students: [Student]) -> [String] {
return students.map { $0.name }
}
此代码使用 map(_ :)
通过将数组中的每个学生返回 $0.name
来将 Student
对象的数组转换为学生名字 String
数组,这是我们常用的一种写法。
在 Swift 5.2 中,可以写成(需要 Xcode 11.4 beta 以上):
代码语言:javascript复制func getStudentsName(from students: [Student]) -> [String] {
return students.map(.name)
}
这样的写法看起来非常清晰,也很简便。和 map(_ :)
一样 filter(_ :)
, reduce(_ :)
等函数也可以直接这样写,比如我们想获取所有年龄大于21岁的学生的名字数组。
extension Student {
var isTwentyOneOrOlder: Bool {
return age >= 21
}
}
func getStudentsName(from students: [Student]) -> [String] {
return student.filter(.isTwentyOneOrOlder)
.map(.name)
}
写成这样并不是必须的,只是在某些情况能让代码看起来更简便,但是有时候则不然,所以可以根据需要选择是否使用。