Swift'te Bir Sözlük Yoluyla Yineleme


222

Swift'in Programlama Dili Kılavuzu'ndaki Xcode'un bana bu denemeyi verdiği cevap konusunda biraz kafam karıştı:

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

Sözlük enine çevrilirken, en büyük sayının değişkene ayarlandığını anlıyorum largest. Ancak, Xcode'un neden largesther teste bağlı olarak 5 kez veya 1 kez veya 3 kez ayarlandığını söylediği konusunda kafam karıştı .

Kod bakıldığında, sadece "Prime" (6, 3, 5, 7, 11, 13) içinde 6 kez ayarlanması gerektiğini görüyorum. O zaman "Fibonacci" herhangi bir sayı atlamak gerekir, çünkü tüm bunlar şu anda "Prime" dan 13 olarak ayarlanmış en büyük daha küçüktür. Daha sonra, 16'ya ve son olarak "Kare" de 25'e ayarlanmalı ve toplam 8 kez verilmelidir.

Tamamen bariz bir şeyi mi kaçırıyorum?

Yanıtlar:


355

Swift'teki sözlükler (ve diğer diller) sıralanmaz. Sözlüğü yinelediğinizde, siparişin başlatma siparişiyle eşleşeceği garantisi yoktur. Bu örnekte Swift, "Kare" tuşunu diğerlerinden önce işler. Döngüye bir print ifadesi ekleyerek bunu görebilirsiniz. 25, karenin 5. elemanıdır, bu yüzden en büyük kare içindeki 5 eleman için 5 kez ayarlanır ve sonra 25'te kalır.

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

Bu yazdırır:

kind: Square
kind: Prime
kind: Fibonacci

1
Çok teşekkür ederim! Kısa bir süre güldüm. Diseksiyon umuduyla her bir anahtar için sayıları toplayıp kaldırmaya devam ettim, ama hiçbir yere ulaşamıyordum. Açıklamanız çok takdir ediliyor!
Nick Kohrn

15
let dict : [String : Any] = ["FirstName" : "Maninder" , "LastName" : "Singh" , "Address" : "Chandigarh"]
dict.forEach { print($0) }

Sonuç olurdu

("Adı", "Maninder") ("Soyadı", "Singh") ("Adres", "Chandigarh")


Bu örneğin 1000 veri döngüsünde daha verimli olup olmadığını söyleyebilir misiniz? Çünkü o kadar büyük bir JSON'um var, bu yüzden sonunda 1GB'lık bir işlem yapmam gerekiyor. Yeni cihazlar çökmeyecek, ancak benim iphone 5s 16GB çökme yarısı.
Daniel Arantes Loverde

Orijinal soru, sözlüklerin siparişlerini koruyup korumadıkları ile ilgili olarak biraz yanıltıcı görünüyor, o zaman yapmadığı zaman düzenlerini korudukları bir örnek gönderiyorsunuz.
Declan McKenna

12

Bu, bir sözlükte yineleme yapmak için kullanıcı tanımlı bir işlevdir:

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

findDic(dict: ["Animal":"Lion", "Bird":"Sparrow"])
//prints Animal : Lion 
         Bird : Sparrow

11

İşte bu deney için bir alternatif (Swift 3.0). Bu size tam olarak hangi sayının en büyük olduğunu söyler.

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

8

Tüm değerleri yinelemek istiyorsanız:

dict.values.forEach { value in
    // print(value)
}

Gerçekten o kadar nefret ediyorum ki, bu doğru. Aptal Joda'da herkesin hızlı konuşması gerekir! 🤮
Sebastian


1

Ayrıca values.makeIterator(), aşağıdaki gibi dikte değerlerini yinelemek için de kullanabilirsiniz :

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

Yinelemeyi daha hızlı bir tarzda da yapabilirsiniz:

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

* sbItemstipte bir[String : NSManagedObject]

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.