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)
它实际上在《快速编程语言》一书中的“控制流->间隔匹配”下。
您可以相应地返回您想要的值:
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)
小智 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)
如果您需要检查一个值是否大于任何数字或在 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)