【问题标题】:Swift: Why does switching over textfields work?斯威夫特:为什么切换文本字段有效?
【发布时间】:2016-06-01 21:22:27
【问题描述】:

例如:

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

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

【问题讨论】:

    标签: ios swift switch-statement


    【解决方案1】:

    在底层,switch 语句使用pattern matching operator (~=) 来定义它可以进行的比较。在你的情况下,它使用this version:

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

    这需要两个相同具体类型的Equatable 参数。在switch语句中,每个case都传入a,要开启的语句传入b。它返回的Bool 定义了case 是否应该被触发,在这种情况下它将返回a == b 的值。

    UITextField继承自NSObject,通过isEqual符合Equatable。因此,为该运算符使用两个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 非常有用——它使您的代码比将大量ifelse if 语句链接在一起更清晰。

    【讨论】:

    • 感谢您的解释。那正是我所想。我不确定这是否有效,所以很高兴听到这是一个有效的用法。
    • 这实际上是 Swift switch 语句的强大示例,而不是 C 的版本。
    猜你喜欢
    • 2016-09-19
    • 1970-01-01
    • 2017-07-22
    • 2017-03-24
    • 1970-01-01
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    • 2020-08-24
    相关资源
    最近更新 更多