【问题标题】:xcode- Refactoring switch with several cases.xcode- 用几种情况重构开关。
【发布时间】:2015-07-19 21:01:54
【问题描述】:

所以基本上我想创建一个键盘,当用户点击一个字母时应该会发生一些事情:

 @IBAction func letterBtn(sender: UIButton) { // All the letter buttons are linked to this func.

        switch sender.currentTitle! {

        case "A":
            moveLetters(sender)
        case "B":
            moveLetters(sender)
        case "C":
            moveLetters(sender)
        case "D":
            moveLetters(sender)
        case "E":
            moveLetters(sender)
        case "F":
            moveLetters(sender)
        case "G":
            moveLetters(sender)


        default :

            println("Error")
        }

    }
func animateLetter (pos: UILabel, btn: UIButton) { // Make the letter move towards a label.

        UIView.animateWithDuration(0.5, animations: { () -> Void in

            btn.center = pos.center
        })
    }

    func moveLetters (btn: UIButton) { // Determine which label the pressed letter should move towards.

        switch emptyPos.count {

        case 1:

            animateLetter(pos1, btn: btn)
            emptyPos.append(0)

        case 2:

            animateLetter(pos2, btn: btn)
            emptyPos.append(0)

        case 3:

            animateLetter(pos3, btn: btn)
            emptyPos.append(0)

        case 4:

            animateLetter(pos4, btn: btn)
            emptyPos.append(0)



        default:
            println("Error")
        }
    }

我发现自己使用了多个 switch case,它们基本上在 2 个不同的功能中做同样的事情,我想知道是否有比对整个字母表使用 26 个 case 以及我的其他功能更好的方法。

【问题讨论】:

    标签: xcode swift switch-statement


    【解决方案1】:

    首先可以combinecase:

    switch sender.currentTitle! {
    case "A", "B", "C": ... etc
        // do something
    

    其次,switch语句允许intervals,你可以通过查看按钮标题的第一个字符从中获利:

    switch sender.currentTitle![0] {
    case "A"..."Z":
        // do something
    }
    

    至于你的其他问题,我会给每个标签一个标签(pos1.tag = 1,pos2.tag = 2)等,并使用viewWithTag 函数来获取正确的标签。

    【讨论】:

    • 非常感谢,这很有帮助:)
    【解决方案2】:

    @Glorfindel 回答 "A"..."Z" 范围很好。您也可以使用NSRegularExpression 这样做:

    let regex = try! NSRegularExpression(pattern: "^[A-Z]", options: .CaseInsensitive)
    let range = NSMakeRange(0, distance(str.startIndex, str.endIndex))
    if let match = regex.firstMatchInString(str, options: .ReportCompletion, range: range) {
        // Do something
    }
    

    【讨论】:

    • 感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2022-12-21
    • 1970-01-01
    • 1970-01-01
    • 2013-05-30
    • 1970-01-01
    • 1970-01-01
    • 2022-06-30
    • 2012-11-27
    相关资源
    最近更新 更多