【问题标题】:Swift extending Array of specific typeSwift 扩展特定类型的数组
【发布时间】:2016-03-24 09:39:09
【问题描述】:

我正在尝试扩展以字典为元素的数组,其中字典的值是可比较的。它基本上就像一个自定义对象数组并按特定属性值对它们进行排序,只是在这种情况下,它是字典,而不是类实例。

可以看到数据结构为Array<Dictionary<Key: Hashable, Value: Comparable>>,虽然前面的代码不受支持..

我认为它接近工作,但由于各种原因失败。

我的第一次尝试是

extension ArrayLiteralConvertible where Element == Dictionary<String, Comparable> {
    func sortByKey<T: Comparable>(key: String, ascending: Bool) -> [[String: T]]? {
        if let dictType = self as? [[String: T]] {
            return ascending ? dictType.sort { return $0[key] < $1[key] } : dictType.sort { return $0[key] > $1[key] }
        } else {
            return nil
        }
    }
}

这在声明中有效,但在使用时会抛出错误

字典不能转换为 '[String: Int]'

另一个尝试:

extension SequenceType where Generator.Element == [String: AnyObject] {
    func sortByKey<T: Comparable>(key: String, ascending: Bool) -> [[String: T]]? {
        if let dictType = self as? [[String: T]] {
            return ascending ? dictType.sort { return $0[key] < $1[key] } : dictType.sort { return $0[key] > $1[key] }
        } else {
            return nil
        }
    }
}

回馈

参数类型“[[String: _]]?”不符合预期的“任何”类型(又名“协议”)

我怎样才能做到这一点?

添加

我做了以下,但它被限制为特定类型,所以我必须为其他类型单独声明,如 String..

extension ArrayLiteralConvertible where Element == [String: Int] {
    func sortByKey(key: String, ascending: Bool) -> [[String: Int]] {
        let arraySelf = self as! [[String: Int]]
        return ascending ? arraySelf.sort { return $0[key] < $1[key] } : arraySelf.sort { return $0[key] > $1[key] }
    }
}

另一种选择:

func sortArray<T: Comparable>(array: [[String: T]], byKey key: String, ascending: Bool) -> [[String: T]] {
    return ascending ? array.sort { return $0[key] < $1[key] } : array.sort { return $0[key] > $1[key] }
}

【问题讨论】:

    标签: arrays swift generics dictionary extension-methods


    【解决方案1】:

    我认为你做得很好。我不知道你是否会更喜欢这个:

    func sortedArrayOfDictionaries<T:Comparable>(arr:[[NSObject:T]], byKey key:NSObject) -> [[NSObject:T]] {
        return arr.sort({ (d1, d2) -> Bool in
            return d1[key] < d2[key]
        })
    }
    

    要使用它,你必须转换你的初始数组,以便键是 NSObject 类型:

    let arr : [[NSObject:Int]] = [["hey":2], ["hey":1]]
    let arr2 = sortedArrayOfDictionaries(arr, byKey: "hey")
    

    我是独立得出的,但经过检查,它与您的第二个解决方案没有显着不同。实际上,唯一的区别是我们不限于字符串键。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-20
      • 1970-01-01
      • 2021-10-17
      • 1970-01-01
      • 1970-01-01
      • 2014-07-24
      相关资源
      最近更新 更多