【问题标题】:How to convert valueForKeyPath in swift如何快速转换 valueForKeyPath
【发布时间】:2015-09-03 05:51:33
【问题描述】:

我在目标 c 中的旧功能是

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

我如何快速转换它,我试图这样但它崩溃了“无法将'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
}

【问题讨论】:

    标签: objective-c swift functional-programming


    【解决方案1】:

    正如您所怀疑的,您可以使用简单的地图来简化代码:

    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,但我怀疑上面的代码要快得多,也更清晰、更简单,国际海事组织。

    【讨论】:

      猜你喜欢
      • 2015-12-28
      • 1970-01-01
      • 2011-07-02
      • 2019-04-04
      • 2021-08-18
      • 2020-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多