web-dev-qa-db-ja.com

Swift配列をインデックス付きの辞書に変換する

Xcode6.4を使用しています

UIViewの配列があり、キー_"v0", "v1"..._を使用して辞書に変換したいと思います。そのようです:

_var dict = [String:UIView]()
for (index, view) in enumerate(views) {
  dict["v\(index)"] = view
}
dict //=> ["v0": <view0>, "v1": <view1> ...]
_

これは機能しますが、私はこれをより機能的なスタイルで実行しようとしています。 dict変数を作成する必要があるのは気になると思います。 enumerate()reduce()を次のように使用したいと思います。

_reduce(enumerate(views), [String:UIView]()) { dict, enumeration in
  dict["v\(enumeration.index)"] = enumeration.element // <- error here
  return dict
}
_

これは良い感じですが、エラーが発生します:_Cannot assign a value of type 'UIView' to a value of type 'UIView?'_ UIView以外のオブジェクト(例:_[String] -> [String:String]_)でこれを試しましたが、同じエラーが発生します。

これをクリーンアップするための提案はありますか?

12
Adam

このようにしてみてください:

_reduce(enumerate(a), [String:UIView]()) { (var dict, enumeration) in
    dict["\(enumeration.index)"] = enumeration.element
    return dict
}
_

Xcode8•Swift 2.

_extension Array where Element: AnyObject {
    var indexedDictionary: [String:Element] {
        var result: [String:Element] = [:]
        for (index, element) in enumerate() {
            result[String(index)] = element
        }
        return result
    }
}
_

Xcode8•Swift 3.

_extension Array  {
    var indexedDictionary: [String: Element] {
        var result: [String: Element] = [:]
        enumerated().forEach({ result[String($0.offset)] = $0.element })
        return result
    }
}
_

Xcode9-10•Swift 4.0-4.2

Swift 4 reduce(into:)メソッドの使用:

_extension Collection  {
    var indexedDictionary: [String: Element] {
        return enumerated().reduce(into: [:]) { $0[String($1.offset)] = $1.element }
    }
}
_

Swift 4 Dictionary(uniqueKeysWithValues:)イニシャライザーを使用し、列挙されたコレクションから新しい配列を渡す:

_extension Collection {
    var indexedDictionary: [String: Element] {
        return Dictionary(uniqueKeysWithValues: enumerated().map{(String($0),$1)})
    }
}
_
25
Leo Dabus