例如:
func textFieldDidBeginEditing(textField: UITextField) {
switch textField {
case stateField:
print("editing state")
case countryField:
print("editing country")
default:
break
}
}
是因为它查看这些字段的地址吗?这是使用switch语句的正确方法吗?
答案 0 :(得分:7)
在幕后,switch
语句使用pattern matching operator(~=
)来定义它可以执行的比较。在您的情况下,它使用this version:
@warn_unused_result
public func ~=<T : Equatable>(a: T, b: T) -> Bool
这需要两个相同具体类型的Equatable
个参数。在switch语句中,每个case都被传递到a
,并且要打开的语句被传递到b
。它返回的Bool
定义是否应该触发案例,在这种情况下它将返回a == b
的值。
UITextField
继承自NSObject
,符合Equatable
通过isEqual
。因此,对此运算符使用两个UITextFields
是有效的,因此在switch
中使用它们是完全有效的。
作为其基本实现,isEqual
只检查指针相等性。因此,您的switch语句确实只是检查您的给定UITextField
是否与给定案例完全相同。
您也可以考虑这样做:
if textField == stateField {
print("editing state")
} else if textField == countryField {
print("editing country")
} else {
// 'default' case
}
这就是这样做的(在NSObject
继承类的情况下):
if textField.isEqual(stateField) {
print("editing state")
} else if textField.isEqual(countryField) {
print("editing country")
} else {
// 'default' case
}
在这里使用switch
非常有用 - 它使您的代码比链接大量if
&amp; else if
一起发表声明。