2017-11-15 2 views
1

Ich arbeite derzeit durch die Grundlagen der Typ Casting und Inspektion in swift 4. Ich habe ein Beispiel in der Apple Developer Buch, die ich brauche ein bisschen Hilfe mit.Typ Casting und Inspektion Abfrage

Sie haben eine Übung, um ein Beliebiges Wörterbuch zu erstellen und dann die Werte, die durch das Wörterbuch laufen, auszupacken. Die gegebene Lösung zeigt die for-Schleife mit dem Wert in Klammern, und jeder Wert wird ausgepackt. Kann jemand eine Erklärung für die gezeigte Lösung geben? und gibt es einen anderen (einfachen) Weg, dies zu lösen? Es gibt nicht genug Informationen in dem Buch.

let anythingAndEverything: [String: Any] = ["FirstBool": true, 
"FalseBool": false, "Unknown": "90", "AnInteger": 12, "ADouble": 1.1] 

print(anythingAndEverything) 

var total: Double = 0 
for (_, value) in anythingAndEverything { 
    if let value = value as? Bool { 
     if value { 
      total += 2 
     } else { 
      total -= 3 
     } 
    } else if let value = value as? Double { 
     total += value 
    } else if let value = value as? Int { 
     total += Double(value) 
    } else if let value = value as? String { 
     total += 1 
    } 
} 

print(total) 

Vielen Dank für jede Hilfe im Voraus :-)

Antwort

0

Dictionary entspricht Collection, was Sequence entspricht. Dies bedeutet, dass ein Wörterbuch mit einer for ... in-Schleife durchgeschleift werden kann.

In der Definition von Dictionary gibt es diese Zeile:

public typealias Element = (key: Key, value: Value) 

Das bedeutet, dass "in der Sammlung ein Wörterbuch genannt, es Elemente vom Typ enthält (key: Key, value: Value)". Dies bedeutet, dass Sie (key: Key, value: Value) als Typ der Variablen vor in erhalten:

for element in someDictionary { 
    // element is of type (key: Key, value: Value) 
} 

Da element ein Tupel ist, können wir tatsächlich das Tupel auszupacken durch dies zu tun:

for (key, value) in someDictionary {} 

In Ihrer spezifischen Situation , wir brauchen die key Bit nicht, so dass wir schreiben _ zu sagen, "diese wegzuwerfen":

for (_, value) in someDictionary {} 

Eine andere Möglichkeit, dies zu lösen, ist die Verwendung von reduce. Ich würde nicht sagen, dass dies notwendigerweise obwohl einfacher ist:

total = anythingAndEverything.reduce(0.0) { (x, y) -> Double in 
    if let value = y.value as? Bool { 
     if value { 
      return x + 2 
     } else { 
      return x - 3 
     } 
    } else if let value = y.value as? Double { 
     return x + value 
    } else if let value = y.value as? Int { 
     return x + Double(value) 
    } else if let value = y.value as? String { 
     return x + 1 
    } else { 
     return x 
    } 
} 
+0

danke @Sweeper, die sicherlich einige meiner Verwirrung geklärt hat. Ich werde ein Experiment mit der oben vorgeschlagenen Reduzierungslösung machen und sehen, ob ich ein Beispiel für die Arbeit bekommen kann. – Gemma

0

Außerdem empfehle ich Ihnen eine offizielle Erklärung von Apple's Swift guide zu lesen. Es gibt auch ein gutes Beispiel dafür, wie Sie durch Collection blättern und switch statement verwenden, um nach dem Typ des Werts zu suchen.

for thing in things { 
    switch thing { 
    case 0 as Int: 
     print("zero as an Int") 
    case 0 as Double: 
     print("zero as a Double") 
    case let someInt as Int: 
     print("an integer value of \(someInt)") 
    case let someDouble as Double where someDouble > 0: 
     print("a positive double value of \(someDouble)") 
    case is Double: 
     print("some other double value that I don't want to print") 
    case let someString as String: 
     print("a string value of \"\(someString)\"") 
    case let (x, y) as (Double, Double): 
     print("an (x, y) point at \(x), \(y)") 
    case let movie as Movie: 
     print("a movie called \(movie.name), dir. \(movie.director)") 
    case let stringConverter as (String) -> String: 
     print(stringConverter("Michael")) 
    default: 
     print("something else") 
    } 
} 

Ich würde auch diesen Teil erklären mag:

case let varName as TypeName 

Das bedeutet, dass, wenn die neuen varName die nicht optionale Version von thing gleich und auch vom Typ TypeName, damit die nächsten tun.

+0

danke Stepan :-) Ich hatte das Beispiel im Apple Swift Guide gelesen, hatte aber immer noch Probleme. Ich werde ein paar Übungsaufgaben mit dem Fall Let versuchen. Das obige Beispiel scheint sehr einfach zu sein. – Gemma