我有一个[uid: true, uid: false, uid: false, uid: false]
字典。我如何在Swift中计算true
和false
值的数量,以便我可以看到此词典中有1 true
和3 false
?
答案 0 :(得分:3)
使用filter
方法删除您不想要的值,然后只需在结果上调用count
。
// Get the count of everything which is true
let trueCount = dict.filter { $0.value }.count
// Get the count of everything which is false
let falseCount = dict.filter { !$0.value }.count
// A more efficient way to get the count of everything which is false
let falseCount = dict.count - trueCount
答案 1 :(得分:3)
最直接的方法是使用为此目的设计的构造:计数集。没有原生Swift计数集,但您可以使用NSCountedSet
。
计数集与集合的工作方式完全相同,但它计算向元素添加元素的次数。
let dict = [
"key1": true,
"key2": true,
"key3": false
]
let countedSet = NSCountedSet()
for (_, value) in dict {
countedSet.add(value)
}
print("Count for true: \(countedSet.count(for: true))")
答案 2 :(得分:0)
您可以使用reduce
之类的高阶函数:
let trueFalstDict: [String: Bool] = ["id1": false, "id2": true, "id3": false, "id4": false]
var trueFalseCount: (trues: Int, falses: Int)
trueFalseCount.trues = trueFalstDict.reduce(0) { $0 + ($1.value ? 1 : 0) }
trueFalseCount.falses = trueFalstDict.reduce(0) { $0 + ($1.value ? 0 : 1) }
print(trueFalseCount) // (trues: 1, falses: 3)
使用@ deanWombourne的建议:
let trueFalstDict: [String: Bool] = ["id1": false, "id2": true, "id3": false, "id4": false]
var trueFalseCount: (trues: Int, falses: Int)
trueFalseCount = trueFalstDict.reduce((trues: 0, falses: 0)) {
return (
true: $0.trues + ($1.value ? 1 : 0),
false: $0.falses + ($1.value ? 0 : 1)
)
}
print(trueFalseCount) // (trues: 1, falses: 3)
答案 3 :(得分:0)
示例设置:
let dict = [
1: true,
2: false,
3: false,
4: false
]
使用NSCountedSet
:
let numTrue = NSCountedSet(dict.values).count(for: true)
let numFalse = dict.count - numTrue
使用reduce
:
let numTrue = dict.values.reduce(0) { $0 + ($1 ? 1 : 0) }
let numFalse = dict.count - numTrue
这两种方法都利用Bool
仅允许两个不同值的事实,允许简单计算例如false
计数,假设您计算了true
计数(反之亦然)。
答案 4 :(得分:0)
示例:
var currencyDB:[(name: String, value: Double, isShows: Bool, isMain: Bool)] =
[("USD",1.1588, true, true),
("JPY",129.30, true, false),
("BGN",1.9558, true, false),
("CZK",25.657, true, false),
("DKK",7.4526, false, false),
("GBP",0.8905, false, false)]
print(currencyDB.map{ $0.2 }.filter { $0 }.count)) // print: 4 -> trues
print(currencyDB.map{ $0.2 }.filter { !$0 }.count)) // print: 2 -> falses