Array dari kunci kamus dengan cepat

256

Mencoba mengisi array dengan string dari tombol dalam kamus dengan cepat.

var componentArray: [String]

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

Ini mengembalikan kesalahan: 'AnyObject' tidak identik dengan string

Juga mencoba

componentArray = dict.allKeys as String 

tetapi dapatkan: 'String' tidak dapat dikonversi menjadi [String]

Kyle Goslan
sumber

Jawaban:

534

Swift 3 & Swift 4

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

componentArray = dict.allKeys // for NSDictionary
Andrius Steponavičius
sumber
Menariknya, dalam for for - for name in dict.allKeys - 'name' menjadi string dan dapat dicetak dan diproses.
green_knight
Dict tidak memiliki metode kunci. Ini adalah contoh dari NSDictionary, bukan Kamus.
Womble
2
dict.map {$ 0.key}
Nilanshu Jaiswal
55

Dengan Swift 3, Dictionarymemiliki keysproperti. keysmemiliki deklarasi berikut:

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

Koleksi yang hanya berisi kunci-kunci kamus.

Perhatikan bahwa LazyMapCollectionyang dengan mudah dapat dipetakan ke Arraydengan Array's init(_:)initializer.


Dari NSDictionaryke[String]

AppDelegateCuplikan kelas iOS berikut menunjukkan cara mendapatkan array string ( [String]) menggunakan keysproperti dari NSDictionary:

masukkan deskripsi gambar di sini

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
}

Dari [String: Int]ke[String]

Secara lebih umum, kode Playground berikut menunjukkan cara mendapatkan array string ( [String]) menggunakan keysproperti dari kamus dengan kunci string dan nilai integer ( [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"]

Dari [Int: String]ke[String]

Kode Playground berikut menunjukkan cara mendapatkan array string ( [String]) menggunakan keysproperti dari kamus dengan kunci integer dan nilai string ( [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"]
Imanou Petit
sumber
terima kasih untuk detailnya. Dalam Swift 4.x tipenya adalah Dictionary<String, String>.Keys- apakah Anda memiliki wawasan saat kami ingin menggunakan jenis itu dan bagaimana?
bshirley
46

Array dari kunci kamus di Swift

componentArray = [String] (dict.keys)
Santo
sumber
Saya tidak tahu, mengapa orang tidak suka sintaksis steno sementara itu jauh lebih jelas untuk dipahami.
Natasha
9

dict.allKeysbukan String. Ini adalah [String], persis seperti pesan kesalahan memberitahu Anda (dengan asumsi, tentu saja, bahwa kunci adalah semua string; ini adalah persis apa yang Anda nyatakan ketika Anda mengatakan itu).

Jadi, mulailah dengan mengetik componentArraysebagai [AnyObject], karena itu adalah bagaimana itu diketikkan dalam Cocoa API, atau kalau tidak, masukkan dict.allKeyske [String], karena itulah yang Anda ketik componentArray.

matt
sumber
1
Ini sepertinya tidak lagi benar. Dalam Swift 4.2 dict.keys (yang menggantikan .allKeys) bukan [String], ini adalah [Kamus <String, Apa> .Keys] dan harus dilemparkan sebelum menetapkan ke variabel tipe [String] @santo tampaknya memiliki contoh kerja paling sederhana tentang bagaimana melakukan itu.
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
    }
}
Jitesh Desai
sumber
3

NSDictionary adalah Kelas (lulus dengan referensi) Kamus adalah Struktur (lulus dengan nilai ) ====== Array dari NSDictionary ======NSDictionary adalah tipe kelas Kamus adalah struktur kunci dan nilai

NSDictionary memiliki allKeys dan allValues mendapatkan properti dengan tipe [Any] .NSDictionary telah mendapatkan properti [Any] untuk allkey dan 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 From Dictionary ======

Referensi Apple untuk kunci Kamus dan nilai properti. masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

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)
Darshan Panchal
sumber
3

Dari dokumentasi resmi Array Apple :

init(_:) - Membuat array yang mengandung elemen-elemen urutan.

Pernyataan

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

Parameter

s - Urutan elemen untuk berubah menjadi array.

Diskusi

Anda dapat menggunakan penginisialisasi ini untuk membuat array dari tipe lain yang sesuai dengan protokol Sequence ... Anda juga dapat menggunakan initializer ini untuk mengubah urutan kompleks atau tipe koleksi kembali ke array. Misalnya, properti kunci dari sebuah kamus bukanlah sebuah array dengan penyimpanannya sendiri, itu adalah kumpulan yang memetakan elemen-elemennya dari kamus hanya ketika mereka diakses, menghemat waktu dan ruang yang dibutuhkan untuk mengalokasikan sebuah array. Namun, jika Anda perlu meneruskan kunci-kunci itu ke metode yang menggunakan array, gunakan penginisialisasi ini untuk mengonversi daftar itu dari jenisnya 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"]"
Chris Graf
sumber
1

Jawaban ini akan untuk kamus cepat dengan kunci String. Seperti yang di bawah ini .

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

Ini ekstensi yang akan saya gunakan.

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

Dan saya akan mendapatkan semua kunci nanti menggunakan ini.

let componentsArray = dict.allKeys()
jnblanchard
sumber
1

Cepat 5

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

let k = dict.keys

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

Ini bekerja untuk saya.

Siddharth Kavthekar
sumber
1

Anda dapat menggunakan dictionary.map seperti ini:

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

Penjelasan: Peta iterate melalui myDictionary dan menerima setiap pasangan kunci dan nilai sebagai $ 0. Dari sini Anda bisa mendapatkan $ 0.key atau $ 0.value. Di dalam trailing closure {}, Anda bisa mengubah setiap elemen dan mengembalikan elemen itu. Karena Anda ingin $ 0 dan Anda menginginkannya sebagai string maka Anda mengonversi menggunakan String ($ 0.key). Anda mengumpulkan elemen yang diubah ke array string.

Meo Flute
sumber
-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 }
    }
}
Igor Bachek
sumber
2
Hai yang disana! Sementara cuplikan kode ini mungkin solusinya, termasuk penjelasan sangat membantu untuk meningkatkan kualitas posting Anda. Ingatlah bahwa Anda menjawab pertanyaan untuk pembaca di masa depan, dan orang-orang itu mungkin tidak tahu alasan untuk saran kode Anda.
Sayap