首页 > 解决方案 > Swift:在另一个 switch 语句中重构 switch 语句

问题描述

我有一种计算新分数的方法。下面的方法有效,但问题是代码本身看起来可以显着清理。我只是不知道最好的方法是什么。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是一个结构的实例。

标签: swiftstructenumsswitch-statementrefactoring

解决方案


你可以这样做:

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 中不用于字符串文字,只需将其删除。


推荐阅读