首页 > 解决方案 > 减少 Swift 中的“if 语句”(也许使用三元运算符)

问题描述

我正在制作一个应用程序,用户将在州首府接受测验。首都和州会呈现给用户一个 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)")

标签: swiftif-statementternary-operator

解决方案


你总是在做同样的事情。您增加分数,然后更改标签文本。因此,您只需使用一个 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)" 
}

推荐阅读