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.


Log in to reply