Swift 5.2的新功能之一:能够将KeyPaths用作函数。如果您只在闭包中返回某个KeyPath的值,这将非常有用。
keyPaths as Functions
在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)
}
写成这样并不是必须的,只是在某些情况能让代码看起来更简便,但是有时候则不然,所以可以根据需要选择是否使用。