Swift 如果(变量==变量+;5)
我试图在我的场景中展示一枚奖牌,这取决于你的高分是基于这个级别的目标Swift 如果(变量==变量+;5),swift,if-statement,Swift,If Statement,我试图在我的场景中展示一枚奖牌,这取决于你的高分是基于这个级别的目标 // Get Medal Colour if levelHighscore < goalScore { scoreMedal = SKSpriteNode(imageNamed: "noMedal") } else if levelHighscore == goalScore { scoreMedal = SKSpriteNode(imageNamed: "bronzeMe
// Get Medal Colour
if levelHighscore < goalScore {
scoreMedal = SKSpriteNode(imageNamed: "noMedal")
} else if levelHighscore == goalScore {
scoreMedal = SKSpriteNode(imageNamed: "bronzeMedal")
} else if levelHighscore > goalScore {
scoreMedal = SKSpriteNode(imageNamed: "silverMedal")
}
它没有显示任何内容。您需要这样进行比较:
if levelHighscore < goalScore {
scoreMedal = SKSpriteNode(imageNamed: "noMedal")
} else if levelHighscore >= goalScore + 10 {
scoreMedal = SKSpriteNode(imageNamed: "goldMedal")
} else if levelHighscore >= goalScore + 5 {
scoreMedal = SKSpriteNode(imageNamed: "silverMedal")
} else {
scoreMedal = SKSpriteNode(imageNamed: "bronzeMedal")
}
如果levelHighscore=目标分数+10{
scoreMedal=SKSpriteNode(图像名为:“金牌”)
}否则,如果levelHighscore>=目标分数+5{
scoreMedal=SKSpriteNode(图像名为“银牌”)
}否则{
scoreMedal=SKSpriteNode(图像名为:“bronzeMedal”)
}
重要的部分是先检查较高的值,然后检查较低的值
为了使逻辑更清晰,您可以按如下方式格式化代码:
if levelHighscore < goalScore {
scoreMedal = SKSpriteNode(imageNamed: "noMedal")
} else {
// We now know the score is greater or equal to goal
// First see if it's hight enough for gold
if levelHighscore >= goalScore + 10 {
scoreMedal = SKSpriteNode(imageNamed: "goldMedal")
} else {
// Nope, maybe it's silver
if levelHighscore >= goalScore + 5 {
// Yes, it's 5 or more but less than 10 over so it's silver
scoreMedal = SKSpriteNode(imageNamed: "silverMedal")
} else {
// No, it's less than 5 over leaving bronze
scoreMedal = SKSpriteNode(imageNamed: "bronzeMedal")
}
}
}
如果levelHighscore=目标分数+10{
scoreMedal=SKSpriteNode(图像名为:“金牌”)
}否则{
//不,也许是银色的
如果levelHighscore>=目标分数+5{
//是的,它是5或更多,但小于10以上,所以它是银色的
scoreMedal=SKSpriteNode(图像名为“银牌”)
}否则{
//不,剩下铜牌还不到5分
scoreMedal=SKSpriteNode(图像名为:“bronzeMedal”)
}
}
}
根据您的口味,我觉得这更容易阅读和理解
switch levelHighscore - goalScore {
case 0 ..< 5: scoreMedal = SKSpriteNode(imageNamed: "bronzeMedal")
case 5 ..< 10: scoreMedal = SKSpriteNode(imageNamed: "silverMedal")
case 10 ... .max: scoreMedal = SKSpriteNode(imageNamed: "goldMedal")
default: scoreMedal = SKSpriteNode(imageNamed: "noMedal")
}
switch levelHighscore-goalScore{
案例0.<5:scoreMedal=SKSpriteNode(图像名为:“bronzeMedal”)
案例5.<10:scoreMedal=SKSpriteNode(图像名为:“silverMedal”)
案例10…最大值:scoreMedal=SKSpriteNode(图像名称:“goldMedal”)
默认值:scoreMedal=SKSpriteNode(图像名称:“noMedal”)
}
然而,@rmaddy的答案非常好。这里有一些很好的答案,但我会选择稍微不同的方式 首先,一系列具体值有助于使用
enum
:
/// Raw values are the minimum for each Medal type.
/// For .none the raw value indicates any negative value
enum Medal: Int {
case none = -1
case bronze = 0
case silver = 5
case gold = 10
}
然后我们添加一个初始值设定项,该初始值设定项接受一个分数和一个目标。我们还添加了一个image
属性,该属性返回一个SKSpriteNode
:
extension Medal {
init(score: Int, goal: Int) {
switch score - goal {
case Medal.bronze.rawValue ..< Medal.silver.rawValue: self = .bronze
case Medal.silver.rawValue ..< Medal.gold.rawValue : self = .silver
case Medal.gold.rawValue ..< Int.max : self = .gold
default : self = .none
}
}
var image: SKSpriteNode {
switch self {
case .none : return SKSpriteNode(imageNamed: "noMedal")
case .bronze: return SKSpriteNode(imageNamed: "bronzeMedal")
case .silver: return SKSpriteNode(imageNamed: "silverMedal")
case .gold : return SKSpriteNode(imageNamed: "goldMedal")
}
}
}
或
也许您想要
=
而不是=
,您需要使用if
和if else
来捕获范围,而不是特定的值。使用此选项可能更可取开关。现在这是可能的,但在Swift 4中会更好:@PEEJWEEJ根据我的理解,在这种情况下,单边范围基本上会在Int.min
或Int.max
结束,这取决于范围的定义侧。这将节省一点代码,但不会太激进,因为您可以简单地将缺少的一面显式定义为Int.min
或Int.max
,就像我在这里所做的那样,考虑到正在发展的末日金字塔,我建议至少使用一个错误防护(noMedal)案例。@PEEJWEEJ我不推荐“末日金字塔”。那只是为了举例说明。为什么是一个警卫
?检查分数不足只是检查if/else
中的另一项检查。一行if
和一长else
通常是guard
的好选择。它清楚地说明了逃生箱是什么,减少了压痕,使其更干净、更安全readable@PEEJWEEJ但是我的实际答案(第一段代码)没有很长的else,也没有超过一级的缩进。干净多了。我花了35年时间编写C/C++/Java/Objective-C。我在Swift中花了6个月的时间。我需要不断提醒自己一些事情,比如更强大、更灵活的Swiftswitch
语句。
extension Medal {
init(score: Int, goal: Int) {
switch score - goal {
case Medal.bronze.rawValue ..< Medal.silver.rawValue: self = .bronze
case Medal.silver.rawValue ..< Medal.gold.rawValue : self = .silver
case Medal.gold.rawValue ..< Int.max : self = .gold
default : self = .none
}
}
var image: SKSpriteNode {
switch self {
case .none : return SKSpriteNode(imageNamed: "noMedal")
case .bronze: return SKSpriteNode(imageNamed: "bronzeMedal")
case .silver: return SKSpriteNode(imageNamed: "silverMedal")
case .gold : return SKSpriteNode(imageNamed: "goldMedal")
}
}
}
let image = Medal(score: 14, goal: 10).image
let image = Medal.bronze.image