在Swift中减少“ if语句”(也许使用三元运算符)

时间:2019-01-18 00:18:41

标签: swift if-statement ternary-operator

我正在制作一个应用程序,在该应用程序中,用户将被州政府的测验。首都和州都向用户提供了一个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)")

1 个答案:

答案 0 :(得分: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)" 
}