2017-01-02 11 views
2

現在、現在のプロジェクトをSwift3(2.3以降)に移行していますが、シーケンスタイプに拡張機能を使用しています。 拡張は、ソース配列から一意の値のディクショナリを返すように設計されています。 つまり、var myArray = ["Apple","Apple","Orange","Banana","Banana"]Swift 3 - ユニークな要素の数を持つ辞書に配列を減らす

「.freq」拡張子は、次の形式の辞書を返します。ここで

["Apple":2,"Orange":1,"Banana":2] 

作品現在スウィフト2.3構文、次のとおりです。

extension Sequence where Self.Iterator.Element: Hashable { 

    func freq() -> [Self.Iterator.Element: Int] { 
     return reduce([:]) { (accu: [Self.Iterator.Element: Int], element) in 
      accu[element] = (accu[element]? + 1) ?? 1 
      return accu 
     } 
    } 
} 

問題はラインaccu[element] = (accu[element]? + 1) ?? 1が原因構文の変更に、スウィフト3で動作しませんです。

添え字で代入することはできません:accuはlet定数です

私はそれがおそらく簡単な修正だと確信していますが、swift3でこれを行う方法の関連する例を見つけることができないようです。

答えて

3

これを試してみてください:

extension Sequence where Self.Iterator.Element: Hashable { 

func freq() -> [Self.Iterator.Element: Int] { 
    return reduce([:]) { 
      (accu: [Self.Iterator.Element: Int], element) in 
      var accu2 = accu 
      accu2[element] = (accu2[element] ?? 0) + 1 
      return accu2 
     } 
    } 
} 
+0

は素晴らしい作品。ありがとう。 – Villainsoft

+0

あなたはようこそ@Villainsoft – wajeeh

関連する問題