1

私はNSCountedSetよりSwift似た方法で使用する方法を探しています(それが何を意味するにせよ)。

基本的に から直接翻訳した次のスニペットを検討してくださいObjective C。セット内の各シンボル (a 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)
}

ただし、ここでのカウントは実際のカウントではなく、列挙インデックスです。

どうすればこれを進めることができますか?

4

1 に答える 1

1

の操作にflatMap続いて、を連鎖させることができます。reducesymbolSet

  • この操作は、試行されたメンバーflatMapの変換をに適用しますsymbolSetString
  • 次の操作は、(インスタンスに正常に変換されたシンボルの)内のシンボルreduceの加重合計を計算します。countsymbolSetString

セットアップ例:

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チェーンされたand操作で加重累積合計を計算しreduceます (期待される結果: 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
于 2016-12-01T17:30:26.497 に答える