【问题标题】:Reducing "if statements" in Swift (using ternary operators, perhaps)减少 Swift 中的“if 语句”(也许使用三元运算符)
【发布时间】:2019-06-12 06:08:01
【问题描述】:

我正在制作一个应用程序,用户将在该应用程序中接受有关州首府的测验。首都和州会呈现给用户一个 UIImage,我让一切正常工作。为了减少代码,我试图弄清楚如何避免所有这些“if 语句”。下面的“if 语句”仅代表四个州和首府城市。再想象这些行四十六次。这似乎有点多,对吧?我在研究算法时遇到过三元运算符,并试图用它们来减少这段代码,但我没有成功。我有两个 UIImage 数组 - 一个包含城市,另一个包含州。我的应用程序识别用户答案是否正确的方式是匹配相应的数组索引。

这是我的缩写数组...

let capitalCityList: [UIImage] = [
    UIImage(named: "Montgomery")!,  
    UIImage(named: "Juneau")!,  
    UIImage(named: "Phoenix")!,  
    UIImage(named: "Little Rock")!

let stateWordList: [UIImage] = [
    UIImage(named: "Alabama")!,  
    UIImage(named: "Alaska")!,  
    UIImage(named: "Arizona")!,  
    UIImage(named: "Arkansas")!

这是前四个“if 语句”...

if capitalCity.image == capitalCityList[0] && stateWord.image == stateWordList[0] {

            scoreInt += 1
            scoreLabel.text = String("Score: \(scoreInt)")

        } else if capitalCity.image == capitalCityList[1] && stateWord.image == stateWordList[1] {

            scoreInt += 1
            scoreLabel.text = String("Score: \(scoreInt)")

        } else if capitalCity.image == capitalCityList[2] && stateWord.image == stateWordList[2] {

            scoreInt += 1
            scoreLabel.text = String("Score: \(scoreInt)")

        } else if capitalCity.image == capitalCityList[3] && stateWord.image == stateWordList[3] {

            scoreInt += 1
            scoreLabel.text = String("Score: \(scoreInt)")

        } else if capitalCityWord.image == capitalCityList[4] && stateWord.image == stateWordList[4] {

            scoreInt += 1
            scoreLabel.text = String("Score: \(scoreInt)")

【问题讨论】:

  • swift for loop: for index, element in array? 的可能副本 - 我认为 third example in this answer 最接近您想要的。
  • Ken Y-N ... 是否可以一次循环遍历两个枚举数组并比较索引?
  • 不,但是你有索引,所以你可以用它来查找第二个数组。
  • @KenY-N 有更好的解决方案。例如在这种情况下的字典。你可以看看我的回答

标签: swift if-statement ternary-operator


【解决方案1】:

你总是在做同样的事情。您增加分数,然后更改标签文本。所以你可以只用一个 if 语句来做到这一点,因为UIImage 符合协议Equatable,你可以将元素的索引作为数组内的图像索引,所以你不必手动为每个循环创建

if let index = capitalCityList.index(of: capitalCity.image),
   capitalCity.image == capitalCityList[index] 
   && stateWord.image == stateWordList[index]  { // these conditions can be written on one line
    scoreInt += 1
    scoreLabel.text = "Score: \(scoreInt)" 
}

无论如何,您可以使用格式为[image for state: image for city] 的图像进行字典化

let dict = [UIImage(named: "Alabama")!:UIImage(named: "Montgomery")!, ...] 

然后您可以比较州图像的图像是否等于首都图像

if dict[stateWord.image] == capitalCity.image {
    scoreInt += 1
    scoreLabel.text = "Score: \(scoreInt)" 
}

【讨论】:

  • 感谢您的信息。使用两个单独的数组对我来说效果很好,因为我从它们中随机抽取城市和州,以便用户尝试正确匹配。用字典也可以,但我不确定。
  • 关于你答案的第一部分,我试过了,我得到了这个错误...... 可选类型'UIImage?'的值必须解包为“UIImage”类型的值如果我用“!”解包,那么它会崩溃。
  • if let index = capitalCityList.index(of: capitalCity.image)
  • @salanthonyc 你在哪里调用这个 if 语句?也许您在尚未选择任何图像时调用它。
  • 我在 startGame 函数中调用它。用户按下按钮开始游戏。随机的首都城市和州出现在屏幕上。如果匹配,用户按下按钮。我的问题中发布的代码在该函数中完美运行。我只是想减少我的代码的长度。我愿意接受更多建议。但是,我认为我需要在 startGame 函数中调用它。
猜你喜欢
  • 1970-01-01
  • 2017-10-20
  • 1970-01-01
  • 2018-12-08
  • 2016-03-05
  • 1970-01-01
  • 2018-12-26
  • 2011-05-10
  • 2019-11-09
相关资源
最近更新 更多