Swift:需要根据按下的按钮重构大量整数

Swift: Need to refactor incrementing a lot of integers based on which button is pushed

我有很多整数需要在按下某些按钮时加一。这是我如何实现这一目标的简短版本。

@IBAction func incrementAction(_ sender: UIButton) {
        switch sender.tag {
        case 0:
            redCount += 1
        case 1:
            blueCount += 1
        case 2:
            greenCount += 1
        default:
            ()
        }
    }

这可行,但我不希望 switch case 列表变得太长。另外,我认为这有点违反 DRY 概念。

我尝试通过执行以下操作解决此问题。

let colorArray = [redCount, blueCount, greenCount]
var colorCount = colorArray[sender.tag]
colorCount += 1

但是,数组中的整数不会单独更新。

字典似乎是最适合这项工作的数据结构。而不是使用标签来标识视图,您应该向其添加 Color,并直接引用它。

import AppKit

enum Colour: CaseIterable { case red, green, blue }

class MyColouredButton: UIButton {
    var colour: Colour = .red // some default value, change this.
}

class MyVC: UIViewController {
    var colourCounts = [Colour: Int]()

    @IBAction func incrementAction(_ sender: MyColouredButton) {
        colourCounts[sender.colour, default: 0] += 1
    }
}

您可以尝试这样的操作:

enum Color: Int {
    case red = 0
    case blue = 1
    case green = 2
}


var colors: [Color : Int] = [.red : 0, .green : 0, .blue : 0]


func incrementColorCount(tag: Int) {

    guard let color = Color(rawValue: tag), let colorCount = colors[color] else {
        print("Invalid color")
        return
    }
    colors[color] = colorCount + 1
}

// Test
incrementColorCount(tag: 0)
incrementColorCount(tag: 1)

colors.forEach {
    print("Color: \([=10=].key) has been hit \([=10=].value) times")
}

//Color: red has been hit 1 times
//Color: green has been hit 0 times
//Color: blue has been hit 1 times