Swift:为什么切换文本字段有效?

时间:2016-06-01 21:22:28

标签: ios swift switch-statement

例如:

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

是因为它查看这些字段的地址吗?这是使用switch语句的正确方法吗?

1 个答案:

答案 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一起发表声明。