属性获取器作为函数

时间:2018-08-29 06:59:54

标签: swift

是否可以访问属性的getter,以便可以将其传递给filter / map / reduce之类的函数?

例如,假设我有一个User实体:

struct User {
    let firstName: String
    let lastName: String
    let isUnderaged: Bool

    func fullName() -> String {
        return "\(firstName) \(lastName)"
    }
}

let users: [User] = [] // or some computed result

如果我需要过滤所有未满年龄的用户,则需要创建一个临时的匿名闭包,该闭包仅返回isUnderaged值:

let underagedUsers = users.filter { $0.isUnderaged }

相似,如果我想收集所有给定名称:

let givenNames = users.map { $0.firstName }

,我必须创建另一个匿名闭包。

另一方面,可以很好地传递fullName()方法:

let allNames = users.map(User.fullName)

#selector接受#selector(getter: User.isUnderaged)形式(User必须是一个类,它才能正常工作,仅以它为例)。

Swift是否支持这样的功能-将getter传递给允许闭包的函数?

正在搜索与此users.filter(User.isUnderaged)类似的内容-由于isUnderaged当前没有实例,因此无法编译。

1 个答案:

答案 0 :(得分:0)

Swift 5.2 开始,由于 this Swift Evolution 提案,这现在成为可能。

基本上,关键路径现在可以用在需要函数的地方,比如map/filter

对于问题中的示例,用法如下:

users.filter(\.isUnderaged)
users.map(\.firstName.count) // yes, chaining is also permitted