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
Swift 3 & Swift 4
componentArray = Array(dict.keys) // for Dictionary
componentArray = dict.allKeys // for NSDictionary
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.
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:
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]
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"]
[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"]
Array von Wörterbuchschlüsseln in Swift
componentArray = [String] (dict.keys)
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.
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
}
}
dict.keys.sorted()
das gibt [String] https://developer.Apple.com/documentation/Swift/array/2945003-sorted
NSDictionary ist Klasse (Referenz übergeben) Wörterbuch ist Struktur (Wert übergeben)
====== Array aus NSDictionary ======
NSDictionary besitzt allKeys und allValues Eigenschaften mit Typ [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)
====== Array aus dem Wörterbuch ======
Apple-Referenz für WörterbücherSchlüssel und Werte Eigenschaften .
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)
Aus der offiziellen Array Apple Dokumentation :
init(_:)
- Erstellt ein Array mit den Elementen einer Sequenz.
Array.init<S>(_ s: S) where Element == S.Element, S : Sequence
s - Die Folge von Elementen, die in ein Array umgewandelt werden sollen.
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"]"
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()