我在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
更有效率。