迅速な辞書キーからの配列


256

辞書のキーの文字列を配列にすばやく入力しようとしています。

var componentArray: [String]

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

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

また試しました

componentArray = dict.allKeys as String 

しかし、「文字列」は[文字列]に変換できません

回答:


534

Swift 3およびSwift 4

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

componentArray = dict.allKeys // for NSDictionary

興味深いことに、forループでは-dict.allKeysの名前-'name'は文字列になり、印刷やその他の処理が可能です。
green_knight 2016

dictにはキーメソッドはありません。これは、NSDictionaryのインスタンスであり、Dictionaryではありません。
Womble

2
dict.map {$ 0.key}
Nilanshu Jaiswal

55

Swift 3ではDictionarykeysプロパティがあります。keys次の宣言があります:

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

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

これLazyMapCollectionArraywith Arrayinit(_:)イニシャライザに簡単にマッピングできることに注意してください。


から NSDictionary[String]

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

ここに画像の説明を入力してください

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"]

詳細をありがとう。Swift 4.xのタイプは次のとおりDictionary<String, String>.Keysです。そのタイプを使用したい場合、どのような方法で洞察を得られますか?
bshirley

46

Swiftの辞書キーの配列

componentArray = [String] (dict.keys)

理解するのがはるかに明確であるのに、なぜ人々が省略構文を好まないのか、私にはわかりません。
ナターシャ

9

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

つまり、Cocoa APIでの入力方法であるcomponentArrayas [AnyObject]と入力するかdict.allKeys、キャストする場合は、入力した方法であるにキャストし[String]ますcomponentArray


1
これはもはや本当ではないようです。Swift 4.2では、dict.keys(.allKeysを置き換える)は[String]ではなく、[Dictionary <String、Any> .Keys]であり、[String]型の変数に割り当てる前にキャストする必要があります@santoはそれを行う方法の最も単純な実用例。
timeSmith

5
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

NSDictionaryクラス(参照渡し) 辞書構造(値渡し) ====== NSDictionaryからの配列======NSDictionaryはクラス型です 辞書はキーと値の構造です

NSDictionaryにはallKeysallValuesにタイプ[Any]のプロパティがあります。NSDictionaryには、すべてのキーとすべての値の[Any]プロパティがあります

  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)

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

辞書の キー値のプロパティに関するAppleリファレンス。 ここに画像の説明を入力してください

ここに画像の説明を入力してください

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)


3

公式のArray Appleドキュメントから

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

宣言

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

パラメーター

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

討論

この初期化子を使用して、Sequenceプロトコルに準拠する他の型から配列を作成できます。この初期化子を使用して、複雑なシーケンスまたはコレクション型を配列に変換することもできます。たとえば、ディクショナリのkeysプロパティは独自のストレージを持つ配列ではなく、アクセスされたときにのみディクショナリからその要素をマップするコレクションであり、配列の割り当てに必要な時間とスペースを節約します。ただし、配列を受け取るメソッドにこれらのキーを渡す必要がある場合は、この初期化子を使用して、リストをのタイプから変換します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"]"

1

この答えは、文字列キーを使用した迅速な辞書です。以下のように

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()

1

スウィフト5

var dict = ["key1":"Value1", "key2":"Value2"]

let k = dict.keys

var a: [String]()
a.append(contentsOf: k)

これは私にとってはうまくいきます。


1

次のようにdictionary.mapを使用できます。

let myKeys: [String] = myDictionary.map{String($0.key) }

説明:マップはmyDictionaryを反復処理し、各キーと値のペアを$ 0として受け入れます。ここから、$ 0.keyまたは$ 0.valueを取得できます。末尾のクロージャー{}内では、各要素を変換してその要素を返すことができます。$ 0が必要で、それを文字列として取得したい場合は、String($ 0.key)を使用して変換します。変換された要素を文字列の配列に収集します。


-2
// Old version (for history)
let keys = dictionary.keys.map { $0 }
let keys = dictionary?.keys.map { $0 } ?? [T]()

// New more explained version for our ducks
extension Dictionary {

    var allKeys: [Dictionary.Key] {
        return self.keys.map { $0 }
    }
}

2
ちょっと、そこ!このコードスニペットが解決策になる可能性がありますが、説明を含めると、投稿の品質を向上させるのに役立ちます。あなたは将来の読者のための質問に答えていることを覚えておいてください、そしてそれらの人々はあなたのコード提案の理由を知らないかもしれません。
ウィング
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.