Swift 3和Swift 2:
您可以使用类型的字典
[String: Int]来为您的每个项目建立计数
[String]:
let arr = ["FOO", "FOO", "BAR", "FOOBAR"]var counts: [String: Int] = [:]for item in arr { counts[item] = (counts[item] ?? 0) + 1}print(counts) // "[BAR: 1, FOOBAR: 1, FOO: 2]"for (key, value) in counts { print("(key) occurs (value) time(s)")}输出:
BAR occurs 1 time(s)FOOBAR occurs 1 time(s)FOO occurs 2 time(s)
斯威夫特4:
Swift 4 引入了(SE-0165)可以在字典查找中包含默认值的功能,并且可以使用诸如
+=和的操作来改变结果值
-=,因此:
counts[item] = (counts[item] ?? 0) + 1
变成:
counts[item, default: 0] += 1
这使得使用
forEach以下命令在一条简洁的代码行中轻松进行计数操作:
let arr = ["FOO", "FOO", "BAR", "FOOBAR"]var counts: [String: Int] = [:]arr.forEach { counts[$0, default: 0] += 1 }print(counts) // "["FOOBAR": 1, "FOO": 2, "BAR": 1]"斯威夫特4:reduce(into:_:)
Swift 4引入了一个新版本,
reduce该版本使用
inout变量来累积结果。使用它,计数的创建真正变成了一行:
let arr = ["FOO", "FOO", "BAR", "FOOBAR"]let counts = arr.reduce(into: [:]) { counts, word in counts[word, default: 0] += 1 }print(counts) // ["BAR": 1, "FOOBAR": 1, "FOO": 2]或使用默认参数:
let counts = arr.reduce(into: [:]) { $0[$1, default: 0] += 1 }最后,您可以将其扩展为,
Array以便可以在包含
Hashable项的任何数组上调用它:
extension Array where Element: Hashable { var histogram: [Element: Int] { return self.reduce(into: [:]) { counts, elem in counts[elem, default: 0] += 1 } }}


