Сокращение «операторов if» в Swift (возможно, с использованием троичных операторов) - PullRequest
0 голосов
/ 18 января 2019

Я нахожусь в процессе создания приложения, в котором пользователя будут опрашивать в столицах штатов. Столица и штат представили пользователю 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 голосов
/ 18 января 2019

Ты всегда делаешь одно и то же. Вы увеличиваете счет, а затем меняете текст метки. Таким образом, вы можете сделать это только с одним оператором 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)" 
}
...