Iterating Through a Dictionary in Swift

221

Saya sedikit bingung dengan jawaban yang diberikan Xcode kepada saya untuk percobaan ini di Panduan Bahasa Pemrograman Swift:

// Use a for-in to iterate through a dictionary (experiment)

let interestingNumbers = [
    "Prime": [2, 3, 5, 7, 11, 13],
    "Fibonacci": [1, 1, 2, 3, 5, 8],
    "Square": [1, 4, 9, 16, 25]
]
var largest = 0
for (kind, numbers) in interestingNumbers {
    for number in numbers {
        if number > largest {
            largest = number
        }
    }
}
largest

Saya mengerti bahwa ketika kamus sedang ditransversikan, jumlah terbesar sedang diatur ke variabel largest,. Namun, saya bingung mengapa Xcode mengatakan bahwa largestsedang diatur 5 kali, atau 1 kali, atau 3 kali, tergantung pada setiap tes.

Ketika melihat melalui kode, saya melihat bahwa itu harus ditetapkan 6 kali dalam "Perdana" saja (2, 3, 5, 7, 11, 13). Maka itu harus melewati angka dalam "Fibonacci" karena semuanya kurang dari yang terbesar, yang saat ini ditetapkan ke 13 dari "Perdana". Kemudian, harus diatur ke 16, dan akhirnya 25 di "Square", menghasilkan total 8 kali.

Apakah saya melewatkan sesuatu yang sepenuhnya jelas?

Nick Kohrn
sumber

Jawaban:

355

Kamus dalam bahasa Swift (dan bahasa lainnya) tidak dipesan. Ketika Anda beralih melalui kamus, tidak ada jaminan bahwa pesanan akan cocok dengan pesanan inisialisasi. Dalam contoh ini, Swift memproses kunci "Kotak" di depan yang lain. Anda dapat melihat ini dengan menambahkan pernyataan cetak ke loop. 25 adalah elemen ke-5 dari Square sehingga terbesar akan ditetapkan 5 kali untuk 5 elemen di Square dan kemudian akan tinggal di 25.

let interestingNumbers = [
    "Prime": [2, 3, 5, 7, 11, 13],
    "Fibonacci": [1, 1, 2, 3, 5, 8],
    "Square": [1, 4, 9, 16, 25]
]
var largest = 0
for (kind, numbers) in interestingNumbers {
    println("kind: \(kind)")
    for number in numbers {
        if number > largest {
            largest = number
        }
    }
}
largest

Ini mencetak:

kind: Square
kind: Prime
kind: Fibonacci
Berlari
sumber
1
Terima kasih banyak! Saya bingung untuk sementara waktu. Saya terus menambahkan dan menghapus angka untuk setiap kunci dengan harapan membedahnya, tetapi saya tidak mendapatkan apa-apa. Penjelasan Anda jelas sangat dihargai!
Nick Kohrn
15
let dict : [String : Any] = ["FirstName" : "Maninder" , "LastName" : "Singh" , "Address" : "Chandigarh"]
dict.forEach { print($0) }

Hasilnya akan

("FirstName", "Maninder") ("LastName", "Singh") ("Alamat", "Chandigarh")

Maninderjit Singh
sumber
Bisakah Anda memberi tahu saya jika contoh ini lebih efisien dalam 1.000 data loop? Karena saya punya JSON yang besar, jadi saya butuh pemrosesan 1GB pada akhirnya. Perangkat yang lebih baru tidak akan crash, tetapi di iPhone 5s saya 16GB crash pada setengahnya.
Daniel Arantes Loverde
Ini sepertinya agak menyesatkan mengingat pertanyaan awal adalah tentang apakah kamus mempertahankan pesanan mereka maka Anda memposting contoh di mana mereka mempertahankan pesanan mereka ketika mereka tidak.
Declan McKenna
12

Ini adalah fungsi yang ditentukan pengguna untuk beralih melalui kamus:

func findDic(dict: [String: String]){
    for (key, value) in dict{
    print("\(key) : \(value)")
  }
}

findDic(dict: ["Animal":"Lion", "Bird":"Sparrow"])
//prints Animal : Lion 
         Bird : Sparrow
Rawand Saeed
sumber
11

Berikut adalah alternatif untuk percobaan itu (Swift 3.0). Ini memberi tahu Anda dengan tepat nomor jenis mana yang terbesar.

let interestingNumbers = [
"Prime": [2, 3, 5, 7, 11, 13],
"Fibonacci": [1, 1, 2, 3, 5, 8],
"Square": [1, 4, 9, 16, 25],
]

var largest = 0
var whichKind: String? = nil

for (kind, numbers) in interestingNumbers {
    for number in numbers {
    if number > largest {
        whichKind = kind
        largest = number
    }
  }
}

print(whichKind)
print(largest)

OUTPUT:
Optional("Square")
25
jabbyApps
sumber
8

Jika Anda ingin mengulang semua nilai:

dict.values.forEach { value in
    // print(value)
}
norbDEV
sumber
Saya sangat membenci kenyataan, bahwa ini benar. Dalam berbicara bodoh Joda kepada pencipta cepat setiap orang harus berbicara! 🤮
Sebastian
4

Array adalah koleksi yang dipesan tetapi kamus dan set adalah koleksi yang tidak terurut. Dengan demikian Anda tidak dapat memprediksi urutan iterasi dalam kamus atau set.

Baca artikel ini untuk mengetahui lebih lanjut tentang Jenis Koleksi: Bahasa Pemrograman Swift

Rachit Rawat
sumber
1

Anda juga dapat menggunakan values.makeIterator()untuk beralih pada nilai dict, seperti ini:

for sb in sbItems.values.makeIterator(){
    // do something with your sb item..
    print(sb)
}

Anda juga dapat melakukan iterasi seperti ini, dengan gaya yang lebih cepat:

sbItems.values.makeIterator().forEach{
    // $0 is your dict value..
    print($0) 
}

* sbItemsadalah tipe dikt[String : NSManagedObject]

Yonathan Goriachnick
sumber