Swift 中的 NSCountedSet 枚举
NSCountedSet enumeration in Swift
我正在寻找一种以更 Swift
的方式使用 NSCountedSet
的方法(无论那意味着什么)。
考虑以下我基本上直接从 Objective C
翻译的片段。我遍历集合中的每个符号(String
),获取其对应的计数,并在字典中查找该符号的值。然后我将该值乘以计数并将其添加到总数中。
var total = 0
for symbol in symbolSet {
let count = symbolSet.count(for: symbol)
let item = symbolDictionary[symbol as! String]
let value = item?.value
total+= (count * value!)
}
它有效,但我有点担心 Xcode
为我建议的展开。所以我正在尝试以更 Swift
的方式来做这件事,这样它就更安全了,没有所有的展开。
我是这样开始的:
symbolSet.enumerated().map { item, count in
print(item)
print(count)
}
但这里的count并不是实际的count,而是一个枚举索引
我该如何推进?
您可以在 symbolSet
、
上链接一个 flatMap
,然后是一个 reduce
操作
flatMap
操作将尝试将 symbolSet
成员转换为 String
- 以下
reduce
操作计算 symbolSet
中符号的 count
的加权和(对于成功转换为 String
实例的符号)
示例设置:
struct Item {
let value: Int
init(_ value: Int) { self.value = value }
}
let symbolDictionary = [
"+" : Item(1),
"-" : Item(2),
"/" : Item(4),
"*" : Item(8)
]
var symbolSet = NSCountedSet()
symbolSet.add("*") // accumulated: 8
symbolSet.add("/") // accumulated: 8 + 4 = 12
symbolSet.add("+") // accumulated: 12 + 1 = 13
symbolSet.add("-") // accumulated: 13 + 2 = 15
symbolSet.add("+") // accumulated: 15 + 1 = 16
使用链式 flatMap
和 reduce
操作计算加权累加和(预期结果:16
):
let total = symbolSet
.flatMap { [=11=] as? String } /* <- attempted conversion of each symbol to 'String' */
.reduce(0) { [=11=] + symbolSet.count(for: ) * (symbolDictionary[]?.value ?? 0) }
/* | ^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| | If a key exists for the given symbol as a
| | String, extract the 'value' property of the
| | 'Item' value for this key, otherwise '0'.
| |
| Multiply '...value' or '0' with the 'count' for the given symbol.
\
Add the product to the accumulated sum of the reduce operation. */
print(total) // 16, ok
我正在寻找一种以更 Swift
的方式使用 NSCountedSet
的方法(无论那意味着什么)。
考虑以下我基本上直接从 Objective C
翻译的片段。我遍历集合中的每个符号(String
),获取其对应的计数,并在字典中查找该符号的值。然后我将该值乘以计数并将其添加到总数中。
var total = 0
for symbol in symbolSet {
let count = symbolSet.count(for: symbol)
let item = symbolDictionary[symbol as! String]
let value = item?.value
total+= (count * value!)
}
它有效,但我有点担心 Xcode
为我建议的展开。所以我正在尝试以更 Swift
的方式来做这件事,这样它就更安全了,没有所有的展开。
我是这样开始的:
symbolSet.enumerated().map { item, count in
print(item)
print(count)
}
但这里的count并不是实际的count,而是一个枚举索引
我该如何推进?
您可以在 symbolSet
、
flatMap
,然后是一个 reduce
操作
flatMap
操作将尝试将symbolSet
成员转换为String
- 以下
reduce
操作计算symbolSet
中符号的count
的加权和(对于成功转换为String
实例的符号)
示例设置:
struct Item {
let value: Int
init(_ value: Int) { self.value = value }
}
let symbolDictionary = [
"+" : Item(1),
"-" : Item(2),
"/" : Item(4),
"*" : Item(8)
]
var symbolSet = NSCountedSet()
symbolSet.add("*") // accumulated: 8
symbolSet.add("/") // accumulated: 8 + 4 = 12
symbolSet.add("+") // accumulated: 12 + 1 = 13
symbolSet.add("-") // accumulated: 13 + 2 = 15
symbolSet.add("+") // accumulated: 15 + 1 = 16
使用链式 flatMap
和 reduce
操作计算加权累加和(预期结果:16
):
let total = symbolSet
.flatMap { [=11=] as? String } /* <- attempted conversion of each symbol to 'String' */
.reduce(0) { [=11=] + symbolSet.count(for: ) * (symbolDictionary[]?.value ?? 0) }
/* | ^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| | If a key exists for the given symbol as a
| | String, extract the 'value' property of the
| | 'Item' value for this key, otherwise '0'.
| |
| Multiply '...value' or '0' with the 'count' for the given symbol.
\
Add the product to the accumulated sum of the reduce operation. */
print(total) // 16, ok