swift - 减少 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)")
解决方案
你总是在做同样的事情。您增加分数,然后更改标签文本。因此,您只需使用一个 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)"
}
推荐阅读
- wordpress - 在 Wordpress 中如何加载 functions.php?
- php - PHP路由不包括文件
- php - 我想使用 Laravel 连接根据条件返回特定数量的记录
- csv - EmEditor 宏 CSV
- c# - 如何在 C# 中释放占用了一些 Wild Pointers 和其他动态指针的堆内存
- arrays - C中空数组的本质是什么?
- javascript - 如何在tiptap编辑器中强制第一个节点成为标题H1?
- keystore - 我在 Playstore 上上传我的应用时遇到问题
- r - 向现有 R 包添加新功能
- reactjs - 材质 UI 的问题 - 未找到模块:无法解析“@material-ui/icons/Add”