Hızlıca sözlük tuşlarından dizi


256

Bir diziyi hızlı bir şekilde sözlükteki anahtarlardan dizelerle doldurmaya çalışmak.

var componentArray: [String]

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

Bu şu hatayı döndürür: 'AnyObject' dizeyle özdeş değil

Ayrıca denedi

componentArray = dict.allKeys as String 

ancak get: 'String' [String] biçimine dönüştürülemez

Yanıtlar:


534

Hızlı 3 ve Hızlı 4

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

componentArray = dict.allKeys // for NSDictionary

İlginç bir şekilde, bir for döngüsü içinde - dict.allKeys'deki ad için - 'name' bir dize olur ve yazdırılıp başka şekilde işlenebilir.
green_knight

dict'in bir anahtar yöntemi yoktur. Bu bir Sözlük değil, NSDictionary örneğidir.
Womble

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

55

Swift 3 ile Dictionarybir keysözelliği var. keysaşağıdaki beyanı içerir:

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

Sadece sözlüğün anahtarlarını içeren bir koleksiyon.

O Not LazyMapCollectionkolayca bir eşlenebilir Arrayile Arraybireyin init(_:)başlatıcısı.


Gönderen NSDictionaryiçin[String]

Aşağıdaki iOS AppDelegate sınıfı snippet'i, gelen özelliği [String]kullanarak bir dizelerin ( ) nasıl alınacağını gösterir :keysNSDictionary

resim açıklamasını buraya girin

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
}

Gönderen [String: Int]için[String]

Daha genel bir şekilde, aşağıdaki Oyun Alanı kodu, dize anahtarları ve tamsayı değerlerine ( ) sahip bir sözlükten özellik [String]kullanarak dizelerin ( ) dizisinin nasıl alınacağını gösterir :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"]

Gönderen [Int: String]için[String]

Aşağıdaki Oyun Alanı kodu, tamsayı tuşlarına ve dize değerlerine ( ) sahip bir sözlükten özellik [String]kullanarak dizelerin ( ) dizisinin nasıl alınacağını gösterir :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"]

detay için teşekkürler. Swift 4.x'te tür Dictionary<String, String>.Keys- bu türü ne zaman kullanmak istediğimize dair bir fikrin var mı?
bshirley

46

Swift'te sözlük anahtarlarından dizi

componentArray = [String] (dict.keys)

Bilmiyorum, neden anlamak için daha açıkken insanlar steno sözdizimini tercih etmiyor?
Natasha

9

dict.allKeysbir Dize değildir. Bu bir olan [String]hata mesajı söyler tam olarak, (tuşlar, elbette, varsayarak olan tüm dizeleri; bu böyle söylüyorsun zaman iddia tam olarak ne olduğunu).

Yani, ya yazarak başlamak componentArrayolarak [AnyObject]o Kakao API yazdığınız, yoksa dökme halinde, nasıl, çünkü dict.allKeys, bunu döküm [String]olduğunu Yazdığınız nasıl olduğu için, componentArray.


1
Bu artık doğru değil. Swift 4.2'de dict.keys (.allKeys yerine geçer) bir [String] değildir, bir [Dictionary <String, Any> .Keys] değildir ve [String] @santo türünde bir değişkene atamadan önce kullanılmalıdır. bunun nasıl yapılacağına dair en basit çalışma örneği.
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 olan sınıf (referans ile bu geçiş) sözlük olduğu yapı (değer geçiş ) ====== NSDictionary gelen dizi ======NSDictionary sınıf türüdür Sözlük anahtar ve değerin yapısıdır

NSDictionary allKeys vardır ve allValues [Any] türünde özellikler alır .NSDictionary allkeys ve allvalues ​​için [Any] özelliklerine sahiptir

  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)

====== Sözlükten Dizi ======

Sözlük anahtar ve değer özellikleri için Apple referansı . resim açıklamasını buraya girin

resim açıklamasını buraya girin

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

Resmi Array Apple belgelerinden :

init(_:) - Bir dizinin öğelerini içeren bir dizi oluşturur.

deklarasyon

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

Parametreler

s - Bir diziye dönüştürülecek öğelerin sırası.

Tartışma

Sıra başlatıcı protokolüne uyan başka herhangi bir türden bir dizi oluşturmak için bu başlatıcıyı kullanabilirsiniz ... Karmaşık bir sıralamayı veya koleksiyon türünü tekrar bir diziye dönüştürmek için de bu başlatıcıyı kullanabilirsiniz. Örneğin, bir sözlüğün keys özelliği kendi depolama alanına sahip bir dizi değildir, yalnızca erişildiklerinde öğelerini sözlükten eşleyen ve bir dizi ayırmak için gereken zaman ve yerden tasarruf sağlayan bir koleksiyondur. Ancak, bu anahtarları bir dizi alan bir yönteme geçirmeniz gerekiyorsa, bu listeyi türünden dönüştürmek için bu başlatıcıyı kullanın 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"]"

2

Dictionary.map komutunu şu şekilde kullanabilirsiniz:

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

Açıklama: Harita, myDictionary yoluyla yinelenir ve her anahtar ve değer çiftini 0 $ olarak kabul eder. Buradan $ 0.key veya $ 0.value alabilirsiniz. Sondaki kapatma {} içinde, her bir öğeyi dönüştürebilir ve o öğeyi döndürebilirsiniz. $ 0 istediğiniz ve bir dize olarak istediğiniz için String ($ 0.key) kullanarak dönüştürmek. Dönüştürülen öğeleri bir dizi dizeye toplarsınız.


1

Bu cevap, String tuşları ile hızlı sözlük için olacaktır. Aşağıdaki gibi .

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

İşte kullanacağım uzantı.

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

Ve daha sonra bunu kullanarak tüm anahtarları alacağım.

let componentsArray = dict.allKeys()

1

Hızlı 5

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

let k = dict.keys

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

Bu benim için çalışıyor.


-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
Selam! Bu kod snippet'i çözüm olsa da, bir açıklama da dahil olmak üzere mesajınızın kalitesini artırmaya yardımcı olur. Gelecekte okuyucular için soruyu cevapladığınızı ve bu kişilerin kod önerinizin nedenlerini bilmeyebileceğini unutmayın.
Kanat
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.