Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 如果(变量==变量+;5)_Swift_If Statement - Fatal编程技术网

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个月的时间。我需要不断提醒自己一些事情,比如更强大、更灵活的Swift
switch
语句。
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