Swift: необходимо реорганизовать приращение множества целых чисел, в зависимости от того, какая кнопка нажата - PullRequest
0 голосов
/ 16 декабря 2018

У меня довольно много целых чисел, которые нужно увеличивать на единицу при нажатии определенных кнопок.Вот краткая версия о том, как я этого добиваюсь.

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

Это работает, но я не хочу, чтобы список вариантов переключения становился слишком длинным.Кроме того, я считаю, что это несколько нарушает концепцию DRY.

Я попытался решить эту проблему, выполнив следующие действия.

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

Однако целые числа в массиве не обновляются по отдельности.

Ответы [ 2 ]

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

Вы можете попробовать что-то вроде этого:

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: \($0.key) has been hit \($0.value) times")
}

//Color: red has been hit 1 times
//Color: green has been hit 0 times
//Color: blue has been hit 1 times
0 голосов
/ 16 декабря 2018

Кажется, словарь является наиболее подходящей структурой данных для работы.И вместо того, чтобы использовать тег для идентификации вида, вы должны добавить к нему 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
    }
}
...