2016-12-01 130 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