Swift: Хорошая ли идея использовать необработанное значение enum для доступа к UIButton и строке из константного массива? - PullRequest
0 голосов
/ 28 декабря 2018

Я заранее извиняюсь, это трудно объяснить.При необходимости я предоставлю более подробную информацию.

Это структура констант, которую я использую для ссылки на UIButtons в массиве коллекций и использования в качестве ключей для словарей.

struct Constants {
    static let scoreA = "score_a"
    static let scoreB = "score_b"
    static let scoreC = "score_c"
    static let scoreD = "score_d"


    static let constantsArray = [kScoreA, kScoreB, kScoreC, kScoreD]
    enum Scores: Int, CaseIterable { case scoreA = 1, ScoreB, ScoreC, ScoreD}
}

Мое начальное представлениеКонтроллер имеет много UIButtons.Все кнопки UIB отмечены от 1 и выше.UIButtons подключены к массиву IBOutlet UIButton.Таким образом, я могу избежать слишком большого числа IBOutlets

@IBOutlet var collectionOfScoreButtons: Array<UIButton>!

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

if let scoreAButton = collectionOfScoreButtons[Constants.Scores.scoreA.rawValue - 1]

Порядок UIButtons такой же, как порядок перечисления, напримерScoreA - это первый элемент в перечислении, а кнопка ScoreA - это первая кнопка в массиве.

И я могу получить ключ словаря, например, так, чтобы я мог обновить его значение

// after pushing a score button
func handleScoreValue(tag: Int) {
     let scoreKey = Constants.constantScoreArray[tag - 1]
     dictionary[scoreKey, default: 0] += 1
}

Я не уверен, есть ли лучший способ справиться с этой ситуацией.Код работает хорошо, но я чувствую, что есть лучший способ.

Ответы [ 2 ]

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

Я не вижу никаких преимуществ использования Scores enum для получения ссылки на определенную кнопку, вы все равно должны указать индекс

if let scoreAButton = collectionOfScoreButtons[0]

, также вы можете сделать свой Constants enum и реализовать CaseIterable протокол, который позволяет вам создавать массив всех enum дел, используя Enum.allCases

enum Score: String, CaseIterable {
    case A = "score_a"
    case B = "score_b"
    case C = "score_c"
    case D = "score_d"
}

, тогда я считаю, что у вас есть IBAction для вашей кнопки, чтобы вы могли получить индекс sender в вашем массиве кнопок.Тогда вам не нужно устанавливать tag из UIButton

@IBAction func buttonPressed(_ sender: UIButton) {
    if let index = collectionOfScoreButtons.index(of: sender) {
        handleScoreValue(index: index)
    }
}

Наконец, вы можете получить scoreKey как rawValue регистр для определенного индекса в allCases массиве

func handleScoreValue(index: Int) {
    let scoreKey = Score.allCases[index].rawValue
    dictionary[scoreKey, default: 0] += 1
}
0 голосов
/ 28 декабря 2018

Почему бы просто не использовать enum напрямую?

enum Constants: String, CaseIterable {
    case scoreA = "score_a"
    case scoreB = "score_b"
    case scoreC = "score_c"
    case scoreD = "score_d"
}

Таким образом, вы можете просматривать циклы перечисления, такие как

Constants.allCases[anyIndex].rawValue
...