【发布时间】:2018-10-03 09:14:43
【问题描述】:
我正在尝试编写一个在Array 上运行的通用直方图函数,但由于类型“元素”不符合协议“哈希”,我遇到了困难。
extension Array {
func histogram() -> [Array.Element: Int] {
return self.reduce([Array.Element: Int]()) { (acc, key) in
let value = (acc[key] == nil) ? 1 : (acc[key]! + 1)
return acc.dictionaryByUpdatingKey(key: key, value: value)
}
}
}
dictionaryByUpdatingKey(...) 对现有字典进行如下变异:
extension Dictionary {
func dictionaryByUpdatingKey(key: Dictionary.Key, value: Dictionary.Value) -> Dictionary {
var mutableSelf = self
let _ = mutableSelf.updateValue(value, forKey: key)
return mutableSelf
}
}
我尝试将Array.Element 替换为AnyHashable,然后强制使用key as! AnyHashable,但这看起来很混乱,返回类型最好与Array.Element 的类型相同,而不是AnyHashable。
我希望使用Array 扩展如下:
let names = ["Alex", "Alex", "James"]
print(names.histogram()) // ["James": 1, "Alex": 2]
或
let numbers = [2.0, 2.0, 3.0]
print(numbers.histogram()) // [3.0: 1, 2.0: 2]
【问题讨论】:
-
你应该了解
reduce(into:updateAccumulatingResult:)在这种情况下更有效。
标签: ios arrays swift histogram