gpt4 book ai didi

objective-c - 如何快速转换 valueForKeyPath

转载 作者:搜寻专家 更新时间:2023-10-31 22:22:08 27 4
gpt4 key购买 nike

我在 objective c 中的旧函数是

+ (NSUInteger)getNumberOfDistinctUsers:(NSArray *)users {
NSArray* usersAfterPredicate = [users valueForKeyPath:@"@distinctUnionOfObjects.userName"];
return [usersAfterPredicate count]; }

我如何在 swift 中转换它,我正在尝试这样的事情,但它崩溃了“无法将‘Swift.Array’类型的值转换为‘Swift.AnyObject’”

static func getNumberOfDistinctUsers(users: [ICEPKReferenceDataUser]) -> Int {

var retval : Int = 0
if let usersAfterPredicate = (users as! AnyObject).valueForKeyPath("@distinctUnionOfObjects.userName") {
retval = usersAfterPredicate.count
}
return retval
}

我可以使用 filter、map 或 Reduce 来解决这个问题吗?我只是想使用属性用户名在用户数组中找出不同的用户。

编辑*暴力方式

    static func getNumberOfDistinctUsers(users: [ICEPKReferenceDataUser]) -> Int {

var retvalSet : Set<String> = []
for user in users {
retvalSet.insert(user.userName)
}
return retvalSet.count
}

最佳答案

如你所料,你可以用一张简单的 map 来简化代码:

static func getNumberOfDistinctUsers(users: [ICEPKReferenceDataUser]) -> Int {
return Set(users.lazy.map{$0.userName}).count
}

这利用了您可以使用任何其他序列初始化 Set 的事实。

我在其中添加了 lazy 以避免创建数组的额外副本。不管有没有,它都可以工作,但我希望它能以这种方式提高内存效率。 Array.map 创建另一个 Arrayarray.lazy.map 返回一个惰性集合,它根据请求计算值。

也就是说,我不知道我的方法是否比您的“蛮力”方法好得多。哪个更易于阅读或维护并不明显。我喜欢 map 方法,但它可能是一种权衡(例如,我必须知道添加 lazy ,或者如果这是一个大数组,我可以分配大量内存)。您的代码非常清楚发生了什么,所以我认为那里没有任何问题需要解决。

如果你真的想使用 KVC,你需要将你的数组转换为 NSArray,而不是 AnyObject,但我怀疑上面的代码太多了IMO,速度更快,也更清晰、更简单。

关于objective-c - 如何快速转换 valueForKeyPath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32361379/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com