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