Swift: for-in mit zwei Werten
-
Folgender Code sucht aus dem dictionary die größte Zahl und speichert zudem auch in
largestKind
die Art der Zahl.import Foundation var largest = 0; var largestKind: String?; let interestingNumbers = [ "Prime": [2, 3, 5, 7, 11, 13], "Fibonacci": [1, 1, 2, 3, 5, 8], "Square": [1, 4, 8, 16, 25], ] for (kind, numbers) in interestingNumbers { for number in numbers { if number > largest { largest = number; largestKind = kind; } } } println("The number \(largest) is from the type \(largestKind)");
Der Output hierbei ist aber
The number 25 is from the type Optional("Square")
.Natürlich ist das
Optional
nicht gewünscht. Das habe ich durch das Folgende gelöst.import Foundation var largest = 0; var largestKind: String?; let interestingNumbers = [ "Prime": [2, 3, 5, 7, 11, 13], "Fibonacci": [1, 1, 2, 3, 5, 8], "Square": [1, 4, 8, 16, 25], ] for (kind, numbers) in interestingNumbers { for number in numbers { if number > largest { largest = number; largestKind = kind; } } } if let biggestKind = largestKind { println("The number \(largest) is from the type \(biggestKind)."); }
Dabei ist die Änderung in den letzten Zeilen zu finden. Gibt es hierfür eine bessere Lösung?
-
Wenn du largestKind in einem Optional speicherst, musst du es auch entsprechend entpacken oder, wenn du weißt dass in jedem Fall ein Wert vorhanden ist kannst du einen implicitly unwrapped optional daraus machen.
var largestKind: String!
Ansonsten kannst du in deinem 2. Beispiel das if let weglassen und largestKind mit ! unwrappen
print("The number \(largest) is from the type \(largestKind!)"
Und als Anmerkung: In Swift brauchst du kein Semikolon am Ende einer Zeile.