使用条件排序遍历泛型Swift Dictionary



我在Swift中的一个通用Dictionary集合上有两个版本的循环。我对重构版本不满意,因为它需要从dict.keys.返回的LazyBidirectionalCollection中创建一个新的Array对象

另一方面,可能没有真正的额外开销,我确实抗议得太多了。第三方面,我很想深入了解这一点,我知道a)无法避免创建Array,或者b)有一种方法,但它可能有其他缺点。

func dump1<Key, Val where Key: Hashable, Key: Comparable>(dict: [Key: Val], sort: Bool = true) -> String {
    var d = ""
    if sort {
        for k in sorted(dict.keys, {$0 < $1}) {
            d += "(k): (dict[k]!)n"
        }
    }
    else {
        for k in dict.keys {
            d += "(k): (dict[k]!)n"
        }
    }
    return d
}

func dump2<Key, Val where Key: Hashable, Key: Comparable>(dict: [Key: Val], sort: Bool = true) -> String {
    var d = ""
    var keys = sort ? sorted(dict.keys, {$0 < $1}) : Array(dict.keys)
    for k in keys {
        d += "(k): (dict[k]!)n"
    }
    return d
}

感谢AirSpeed先生(http://airspeedvelocity.net/2014/07/28/collection-and-sequence-helpers/),类型擦除是我所缺少的:

func dumpIt<Key, Val where Key: Hashable, Key: Comparable>(dict: [Key: Val], sort: Bool = true) -> String {
    var printOut = ""
    for k in sort ? SequenceOf(sorted(dict.keys) {$0 < $1}) : SequenceOf(dict.keys) {
        printOut += "(k): (dict[k]!) "
    }
    return printOut
}

尽管后续的问题是,如果我想使用reduce而不是for循环,但我仍然不想创建Array,我如何在上述序列上创建类型擦除的Collection视图。

无论如何,如果数组版本同样有效,这可能是更可取的表示法:

func dumpIt2<Key, Val where Key: Hashable, Key: Comparable>(dict: [Key: Val], sort: Bool = true) -> String {
    return (sort ? sorted(dict.keys) {$0 < $1} : Array(dict.keys)).reduce("") { $0 + "($1): (dict[$1]!) " }
}

我正要提出一些与您更新的答案类似的建议:)。这是Swift 2.0版本(尽管更简洁的"sort(<)"当然可以在Swift 1.2中使用):

func dump<Key, Val where Key: Hashable, Key: Comparable>(dict: [Key: Val], sort: Bool = true) -> String {
    return (sort ? AnySequence(dict.keys.sort(<)) : AnySequence(dict.keys)).reduce("") { $0 + "($1): (dict[$1]!) " }
}

我不知道AnySequence是否真的应该比Array更有效率。

最新更新