web-dev-qa-db-ger.com

Array von Wörterbuchschlüsseln schnell

Beim Versuch, ein Array mit Zeichenfolgen aus den Schlüsseln in einem Wörterbuch in Swift zu füllen.

var componentArray: [String]

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

Dies gibt einen Fehler zurück: 'AnyObject' ist nicht identisch mit String

Auch versucht

componentArray = dict.allKeys as String 

aber get: 'String' kann nicht in [String] konvertiert werden

203
Kyle Goslan

Swift 3 & Swift 4

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

componentArray = dict.allKeys // for NSDictionary
450

Mit Swift 3 verfügt Dictionary über eine keys -Eigenschaft. keys hat die folgende Deklaration:

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

Eine Sammlung, die nur die Schlüssel des Wörterbuchs enthält.

Beachten Sie, dass LazyMapCollection mit Array s init(_:) initializer leicht auf eine Array abgebildet werden kann.


Von NSDictionary bis [String]

Das folgende iOS-AppDelegate-Klassen-Snippet zeigt, wie ein String-Array ([String]) mithilfe der keys-Eigenschaft aus einer NSDictionary-Anweisung abgerufen wird:

 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
}

Von [String: Int] bis [String]

Im Allgemeinen zeigt der folgende Playground-Code, wie ein String-Array ([String]) mithilfe der keys-Eigenschaft aus einem Wörterbuch mit Stringschlüsseln und Ganzzahlwerten ([String: Int]) abgerufen wird:

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

Von [Int: String] bis [String]

Der folgende Playground-Code zeigt, wie Sie ein Array von Strings ([String]) mithilfe der keys-Eigenschaft aus einem Wörterbuch mit Ganzzahlschlüsseln und Stringwerten ([Int: String]) abrufen:

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"]
48
Imanou Petit

Array von Wörterbuchschlüsseln in Swift

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

dict.allKeys ist kein String. Es ist ein [String], genau wie die Fehlermeldung es Ihnen sagt (vorausgesetzt natürlich, dass die Tasten sind alle Zeichenfolgen; genau das behaupten Sie, wenn Sie das sagen).

Beginnen Sie also entweder mit componentArray als [AnyObject], denn so wird es in der Cocoa-API eingegeben, oder, wenn Sie dict.allKeys, wirf es auf [String], denn so haben Sie componentArray eingegeben.

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
    }
}
2
Jitesh Desai
2
Jlam

NSDictionary ist Klasse (Referenz übergeben)NSDictionary is class type Wörterbuch ist Struktur (Wert übergeben) Dictionary is structure of key and value ====== Array aus NSDictionary ======

NSDictionary besitzt allKeys und allValues Eigenschaften mit Typ [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)

====== Array aus dem Wörterbuch ====== 

Apple-Referenz für WörterbücherSchlüssel und Werte Eigenschaften . 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

Aus der offiziellen Array Apple Dokumentation :

init(_:) - Erstellt ein Array mit den Elementen einer Sequenz.

Erklärung

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

Parameter

s - Die Folge von Elementen, die in ein Array umgewandelt werden sollen.

Diskussion

Mit diesem Initialisierer können Sie ein Array aus einem beliebigen anderen Typ erstellen, der dem Sequenzprotokoll entspricht. Mit diesem Initialisierer können Sie auch eine komplexe Sequenz oder einen Auflistungstyp zurück in ein Array konvertieren. Beispielsweise ist die Eigenschaft keys eines Wörterbuchs kein Array mit eigenem Speicher, sondern eine Sammlung, die die Elemente des Wörterbuchs nur beim Zugriff abbildet, wodurch Zeit und Platz gespart werden benötigt, um ein Array zuzuweisen. Wenn Sie diese Schlüssel an eine Methode übergeben müssen, die ein Array annimmt, konvertieren Sie diese Liste mit diesem Initialisierer von ihrem Typ 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

Diese Antwort gilt für Swift-Wörterbücher mit String-Tasten. Wie dieser hier .

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

Hier ist die Erweiterung, die ich verwenden werde.

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 }
  }
}

Und ich bekomme alle Schlüssel später.

let componentsArray = dict.allKeys()
0
jnblanchard