Swift: Refactor switch оператор внутри другого оператора switch - PullRequest
0 голосов
/ 23 декабря 2018

У меня есть метод, который вычисляет новый счет.Приведенный ниже метод работает, но проблема в том, что сам код выглядит так, как будто его можно значительно очистить.Я просто не знаю, что было бы лучшим способом сделать это.Я присваиваю scoreCount целое число в зависимости от filterString и перечисления individualScoreState

func calculateScore(count: Int, filterString: String, individualScoreState: IndividualScores) -> Int {
    var scoreCount: Int = 0
    var results = Results()

    switch filterString {
    case "ScoreA":
        switch individualScoreState {
        case .firstScore:
            scoreCount = results.firstScoreACount
        case .secondScore:
            scoreCount = results.secondScoreACount
        default:
            scoreCount = results.scoreACount
        }
    case @"ScoreB":
        switch individualScoreState {
        case .firstScore:
            scoreCount = results.firstScoreBCount
        case .secondScore:
            scoreCount = results.secondScoreBCount
        default:
            scoreCount = results.scoreBCount
        }
    default:
        switch individualScoreState {
        case .firstScore:
            scoreCount = results.firstScoreACount + results.firstScoreBCount
        case .secondScore:
            scoreCount =  results.secondScoreACount + results.secondScoreBCount
        default:
            scoreCount = results.scoreACount + results.scoreBCount
        }
    }

   return count / scoreCount
}

// Структура результатов

struct Results {
    var scoreACount = 0
    var scoreBCount = 0

    var firstScoreACount = 0
    var firstScoreBCount = 0

    var secondScoreACount = 0
    var secondScoreBCount = 0 
}

Возможно, есть более понятный способ справиться с этим.Возможно, способ объединить два случая переключения?

Редактировать: Забыл упомянуть, что results является экземпляром структуры.

1 Ответ

0 голосов
/ 23 декабря 2018

Вы могли бы сделать что-то вроде этого:

let notB = filterString != "ScoreB" ? 1 : 0
let notA = filterString != "ScoreA" ? 1 : 0

switch individualScoreState {
case .firstScore:
    scoreCount = notB * results.firstScoreACount + notA * results.firstScoreBCount
case .secondScore:
    scoreCount = notB * results.secondScoreACount + notA * results.secondScoreBCount
default:
    scoreCount = notB * results.scoreACount + notA * results.scoreBCount
}

@ в случае @ "ScoreB" используется в Objective C, но не в литералах Swift for String, просто удалите его.

...