Swift: как реализовать перечисление массива строк - PullRequest
1 голос
/ 02 мая 2020

Я пытаюсь реализовать перечисление массива строк следующим образом

import UIKit

enum EstimateItemStatus: Int, [String] {
    case Pending
    case OnHold
    case Done

    var description: [String] {
        switch self {
        case .Pending:
            return ["one", "Two"]
        case .OnHold:
            return ["one", "Two"]
        case .Done:
            return ["one", "Two"]
        }
    }
}

print(EstimateItemStatus.Pending.description)

Но я получаю эту ошибку:

error: processArray.playground:3:31: error: multiple enum raw types 'Int' and '[String]'
enum EstimateItemStatus: Int, [String] {
                         ~~~  ^

Любой из вас знает, как это исправить ошибки, чтобы заставить enum работать?

Я буду очень признателен за вашу помощь.

Ответы [ 3 ]

3 голосов
/ 02 мая 2020

Удалить [String] из объявления enum.

enum EstimateItemStatus: Int {
    case Pending
    case OnHold
    case Done

    var description: [String] {
        switch self {
        case .Pending:
            return ["one", "Two"]
        case .OnHold:
            return ["one", "Two"]
        case .Done:
            return ["one", "Two"]
        }
    }
}
1 голос
/ 02 мая 2020

Вы можете установить необработанное значение вашего перечисления на String, например,

enum EstimateItemStatus: String {
    case Pending: "Pending"
    case OnHold: "OnHold"
    case Done: "Done"
}

, а затем получить к нему доступ, как это

print(EstimateItemStatus.Pending.rawValue)
0 голосов
/ 02 мая 2020

Мы не можем сказать, что вам действительно нужно, потому что вы не используете Int или Array. Возможно, вы хотите 2-String кортежа необработанных значений:

enum EstimateItemStatus: CaseIterable {
  case pending
  case onHold
  case done
}

extension EstimateItemStatus: RawRepresentable {
  init?( rawValue: (String, String) ) {
    guard let `case` = ( Self.allCases.first { $0.rawValue == rawValue } )
    else { return nil }

    self = `case`
  }

  var rawValue: (String, String) {
    switch self {
    case .pending:
      return ("pending", "?")
    case .onHold:
      return ("onHold", "?")
    case .done:
      return ("done", "✅")
    }
  }
}
EstimateItemStatus( rawValue: ("onHold", "?") )?.rawValue // ("onHold", "?")
EstimateItemStatus( rawValue: ("Bootsy Collins", "?") ) // nil
[("done", "✅"), ("pending", "?")].map(EstimateItemStatus.init) // [done, pending]
...