带范围的开关盒

Joh*_*oah 8 switch-statement swift

我正在学习Swift,并在观看视频之前尝试自己编写Ryan Wenderlich的“ Bullseye”游戏。

我需要根据用户与目标数量的接近程度来给用户评分。我试图计算差异,然后检查范围并为用户提供分数,这是我对If-else所做的(对于切换用例无法做到):

private func calculateUserScore() -> Int {
    let diff = abs(randomNumber - Int(bullsEyeSlider.value))
    if diff == 0 {
        return PointsAward.bullseye.rawValue
    } else if diff < 10 {
        return PointsAward.almostBullseye.rawValue
    } else if diff < 30 {
        return PointsAward.close.rawValue
    }
    return 0 // User is not getting points. 
}
Run Code Online (Sandbox Code Playgroud)

有没有办法更优雅地使用Switch-Case?我不能仅仅diff == 0在切换情况下做例如xCode给我一个错误消息。

Rak*_*tri 17

这应该工作。

private func calculateUserScore() -> Int {
    let diff = abs(randomNumber - Int(bullsEyeSlider.value))
    switch diff {
    case 0:
        return PointsAward.bullseye.rawValue
    case 1..<10:
        return PointsAward.almostBullseye.rawValue
    case 10..<30:
        return PointsAward.close.rawValue
    default:
        return 0
    }
}
Run Code Online (Sandbox Code Playgroud)

它实际上在《快速编程语言》一书中的“控制流->间隔匹配”下。


iOS*_*Ser 9

您可以相应地返回您想要的值:

switch diff {
case 0:
    print("Bull Eye")
case 1..<10:
    print("Almost Bull Eye")
case 10..<30:
    print("Close")
default:
    print("Too Far")
}
Run Code Online (Sandbox Code Playgroud)

  • Swift 中的 switch case 会自行中断。如果您需要失败,则需要明确提及。 (2认同)

小智 5

只为你:

enum PointsAward: Int {
    case close
    case almostBullseye
    case bullseye
}

private func calculateUserStory() -> Int {
    let bullsEyeSliderValue = 9
    let randomNumber = 100
    let diff = abs(randomNumber - Int(bullsEyeSliderValue))
    switch diff {
    case 0:
        return PointsAward.bullseye.rawValue
    case 0..<10:
        return PointsAward.almostBullseye.rawValue
    case 0..<30:
        return PointsAward.close.rawValue
    default: return 0
    }
}
Run Code Online (Sandbox Code Playgroud)


Ale*_*cha 5

如果您需要检查一个值是否大于任何数字或在 2 个值之间,则可以使用它where而不是if看起来更干净,这将起作用

func isOutdated(days: Int) -> Outdated {

    var outdatedStatus = Outdated.none

    switch days {
    case _ where days < 5:
        outdatedStatus = .tooLow
    case 5...10:
        outdatedStatus = .low
    case 11...20:
        outdatedStatus = .high
    case _ where days > 20:
        outdatedStatus = .expired
    default:
        outdatedStatus = .none
    }
    return outdatedStatus
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,您还可以编写“case ..&lt;5”和“case 20...”——省略下限或上限。 (3认同)