2016-06-01 12 views
4

Zum Beispiel:Swift: Warum funktioniert das Umschalten zwischen Textfeldern?

func textFieldDidBeginEditing(textField: UITextField) { 
    switch textField { 
    case stateField: 
     print("editing state") 
    case countryField: 
     print("editing country") 
    default: 
     break 
    } 
} 

Ist es, weil sein für diese Felder bei der Adresse suchen? Ist das ein richtiger Weg, die switch-Anweisung zu verwenden?

Antwort

7

Unter der Haube verwendet die switch Anweisung die pattern matching operator (~=), um die Vergleiche zu definieren, die es tun kann. In Ihrem Fall ist mit es this version:

@warn_unused_result 
public func ~=<T : Equatable>(a: T, b: T) -> Bool 

Dies dauert zwei Equatable Argumente vom gleichen konkreter. In der switch-Anweisung wird jeder Fall in a übergeben und die Anweisung zum Einschalten wird an b übergeben. Die zurückgegebene Bool definiert, ob der Fall ausgelöst werden soll, in diesem Fall wird der Wert a == b zurückgegeben.

UITextField erbt von NSObject, die Equatable über isEqual entspricht. Daher ist es zulässig, zwei UITextFields für diesen Operator zu verwenden, und daher ist es absolut zulässig, sie in einem switch zu verwenden.

Als Basisimplementierung überprüft nur die Zeigergleichheit. Daher überprüft Ihre switch-Anweisung in der Tat einfach, dass Ihre gegebene UITextField die genau gleiche Instanz wie ein gegebener Fall ist.

Man könnte denken, auch dies etwa so tun:

if textField == stateField { 
    print("editing state") 
} else if textField == countryField { 
    print("editing country") 
} else { 
    // 'default' case 
} 

Welche dies nur tun, ist (im Fall von NSObject geerbten Klassen):

if textField.isEqual(stateField) { 
    print("editing state") 
} else if textField.isEqual(countryField) { 
    print("editing country") 
} else { 
    // 'default' case 
} 

ein switch hier Mit Nutzung ist groß - Es macht Ihren Code viel übersichtlicher als Verkettung von if & else if Anweisungen zusammen.

+0

Danke für die Erklärung. Das ist was ich dachte. Ich war mir nicht ganz sicher, ob das gültig ist, also ist es gut zu hören, dass dies eine gültige Verwendung ist. – Ezio

+1

Dies ist tatsächlich ein wirklich großartiges Beispiel für die Kraft der Swift-Switch-Anweisung, im Gegensatz zu der C-Version. –