web-dev-qa-db-ja.com

Swiftの辞書キーからの配列

Swiftで辞書のキーからの文字列で配列を埋めようとしています。

var componentArray: [String]

let dict = NSDictionary(contentsOfFile: NSBundle.mainBundle().pathForResource("Components", ofType: "plist")!)
componentArray = dict.allKeys

これはエラーを返します: 'AnyObject'はstringと同一ではありません

また試した

componentArray = dict.allKeys as String 

しかし、get: 'String'は[String]に変換できません。

211
Kyle Goslan

スイフト3&スイフト4

componentArray = Array(dict.keys) // for Dictionary

componentArray = dict.allKeys // for NSDictionary
468

Swift 3では、Dictionarykeys プロパティを持ちます。 keysは次のように宣言されています。

var keys: LazyMapCollection<Dictionary<Key, Value>, Key> { get }

辞書のキーだけを含むコレクション。

LazyMapCollectionArrayinit(_:) initializerを使って簡単にArrayにマッピングできることに注意してください。


NSDictionaryから[String]

次のiOSのAppDelegateクラスのスニペットは、keysからNSDictionaryプロパティを使用して文字列の配列([String])を取得する方法を示しています。

enter image description here

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    let string = Bundle.main.path(forResource: "Components", ofType: "plist")!
    if let dict = NSDictionary(contentsOfFile: string) as? [String : Int] {
        let lazyMapCollection = dict.keys

        let componentArray = Array(lazyMapCollection)
        print(componentArray)
        // prints: ["Car", "Boat"]
    }

    return true
}

[String: Int]から[String]

より一般的な方法で、次のPlaygroundコードは、文字列キーと整数値([String])を持つ辞書からkeysプロパティを使用して文字列([String: Int])の配列を取得する方法を示しています。

let dictionary = ["Gabrielle": 49, "Bree": 32, "Susan": 12, "Lynette": 7]
let lazyMapCollection = dictionary.keys

let stringArray = Array(lazyMapCollection)
print(stringArray)
// prints: ["Bree", "Susan", "Lynette", "Gabrielle"]

[Int: String]から[String]

次のPlaygroundコードは、整数キーと文字列値([String])を持つ辞書からkeysプロパティを使用して文字列([Int: String])の配列を取得する方法を示しています。

let dictionary = [49: "Gabrielle", 32: "Bree", 12: "Susan", 7: "Lynette"]
let lazyMapCollection = dictionary.keys

let stringArray = Array(lazyMapCollection.map { String($0) })
// let stringArray = Array(lazyMapCollection).map { String($0) } // also works
print(stringArray)
// prints: ["32", "12", "7", "49"]
50
Imanou Petit

Swiftの辞書キーからの配列

componentArray = [String] (dict.keys)
38
Santo

dict.allKeysは文字列ではありません。これは[String]です。正確にはエラーメッセージが示すとおりです(もちろん、キーall文字列であると仮定します。これは、あなたが言うときに主張していることとまったく同じです)。

そのため、Cocoa APIではcomponentArray[AnyObject]と入力するか、dict.allKeysをキャストする場合は[String]にキャストします。これがcomponentArrayの入力方法です。

8
matt
extension Array {
    public func toDictionary<Key: Hashable>(with selectKey: (Element) -> Key) -> [Key:Element] {
        var dict = [Key:Element]()
        for element in self {
            dict[selectKey(element)] = element
        }
        return dict
    }
}
3
Jitesh Desai
2
Jlam

NSDictionaryクラス(参照渡し)NSDictionary is class type 辞書構造体(値渡しDictionary is structure of key and value ====== NSDictionaryからの配列======

NSDictionaryにはallKeysallValues[Any]. 型のプロパティを持つ NSDictionary has get [Any] properties for allkeys and allvalues

  let objesctNSDictionary = 
    NSDictionary.init(dictionary: ["BR": "Brazil", "GH": "Ghana", "JP": "Japan"])
            let objectArrayOfAllKeys:Array = objesctNSDictionary.allKeys
            let objectArrayOfAllValues:Array = objesctNSDictionary.allValues
            print(objectArrayOfAllKeys)
            print(objectArrayOfAllValues)

======辞書からの配列======

Dictionary'skeysおよびvaluesプロパティに関するアップルのリファレンス。 enter image description here

enter image description here

let objectDictionary:Dictionary = 
            ["BR": "Brazil", "GH": "Ghana", "JP": "Japan"]
    let objectArrayOfAllKeys:Array = Array(objectDictionary.keys)          
    let objectArrayOfAllValues:Array = Array(objectDictionary.values)
    print(objectArrayOfAllKeys)
    print(objectArrayOfAllValues)
2
Darshan Panchal

公式の Array Apple documentation から:

init(_:)-シーケンスの要素を含む配列を作成します。

宣言

Array.init<S>(_ s: S) where Element == S.Element, S : Sequence

パラメーター

s-配列に変換する要素のシーケンス。

討論

このイニシャライザーを使用して、Sequenceプロトコルに準拠する他の型から配列を作成できます...たとえば、ディクショナリのキープロパティは、独自のストレージを持つ配列ではなく、アクセスされたときにのみディクショナリから要素をマッピングするコレクションであり、時間とスペースを節約します配列を割り当てるために必要です。ただし、配列を受け取るメソッドにこれらのキーを渡す必要がある場合は、この初期化子を使用して、そのリストをLazyMapCollection<Dictionary<String, Int>, Int> to a simple [String]のタイプから変換します。

func cacheImagesWithNames(names: [String]) {
    // custom image loading and caching
 }

let namedHues: [String: Int] = ["Vermillion": 18, "Magenta": 302,
        "Gold": 50, "Cerise": 320]
let colorNames = Array(namedHues.keys)
cacheImagesWithNames(colorNames)

print(colorNames)
// Prints "["Gold", "Cerise", "Magenta", "Vermillion"]"
0
Chris Graf

この答えはSwift辞書w/Stringキーに対するものです。 以下のように

let dict: [String: Int] = ["hey": 1, "yo": 2, "sup": 3, "hello": 4, "whassup": 5]

これが私が使うエクステンションです。

extension Dictionary {
  func allKeys() -> [String] {
    guard self.keys.first is String else {
      debugPrint("This function will not return other hashable types. (Only strings)")
      return []
    }
    return self.flatMap { (anEntry) -> String? in
                          guard let temp = anEntry.key as? String else { return nil }
                          return temp }
  }
}

そして、後でこれを使ってすべてのキーを取得します。

let componentsArray = dict.allKeys()
0
jnblanchard