2016-12-01 86 views
0

我正在寻找一种方式使用NSCountedSet更类似于Swift的方式(无论这意味着什么)。NSCountedSet枚举Swift

请考虑以下代码段,我基本上直接从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) 
} 

但这里算不是实际数量,但它是一个枚举索引。

我该如何向前迈进呢?

回答

1

你可以在你的symbolSet链接一个flatMap后跟一个reduce操作,

  • flatMap操作适用尝试的symbolSet成员转化为String
  • 以下reduce操作计算count的加权总和symbolSet中的符号(对于已成功转换为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 

计算加权累加之和与链flatMapreduce操作(预期成果:16):

let total = symbolSet 
    .flatMap { $0 as? String } /* <- attempted conversion of each symbol to 'String'   */ 
    .reduce(0) { $0 + symbolSet.count(for: $1) * (symbolDictionary[$1]?.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 
+0

这看起来非常有前途,我就可以测试这个今天晚些时候。 – Koen

+0

@Koen乐意帮忙。考虑在下次发布一个问题时(例如,我的Item定义和我的symbolDictionary和SymbolSet实例化,我会提供一个[minimal,complete and verifiable example](http://stackoverflow.com/help/mcve)因为这样可以让未来的回答者更容易帮助你,这反过来会增加变化,你会得到satiesfactory答案:) – dfri

+0

你的例子是非常接近我的情况。只有'value'实际上是一个由两个'Double'属性构成的结构,因此经过一些头疼的事情后,我在'.reduce'行的开始和结尾用'零结构'代替了'Double's到'0'。所有的作品! – Koen