1. ホーム
  2. ios

[解決済み] すべてのenumの値を配列として取得する方法

2022-07-08 14:47:54

質問

以下のようなenumがあります。

enum EstimateItemStatus: Printable {
    case Pending
    case OnHold
    case Done

    var description: String {
        switch self {
        case .Pending: return "Pending"
        case .OnHold: return "On Hold"
        case .Done: return "Done"
        }
    }

    init?(id : Int) {
        switch id {
        case 1:
            self = .Pending
        case 2:
            self = .OnHold
        case 3:
            self = .Done
        default:
            return nil
        }
    }
}

すべての生の値を文字列の配列として取得する必要があります(以下のように ["Pending", "On Hold", "Done"] ).

このメソッドをenumに追加してみました。

func toArray() -> [String] {
    var n = 1
    return Array(
        GeneratorOf<EstimateItemStatus> {
            return EstimateItemStatus(id: n++)!.description
        }
    )
}

でも、以下のようなエラーが出ます。

'(() -> _)' 型の引数リストを受け入れる 'GeneratorOf' 型のイニシャライザが見つかりません。

これを行うには、より簡単な、より良い、またはよりエレガントな方法はありますか?

どのように解決するのですか?

Swift 4.2 (Xcode 10) 以降の場合

があり CaseIterable のプロトコルがあります。

enum EstimateItemStatus: String, CaseIterable {
    case pending = "Pending"
    case onHold = "OnHold"
    case done = "Done"

    init?(id : Int) {
        switch id {
        case 1: self = .pending
        case 2: self = .onHold
        case 3: self = .done
        default: return nil
        }
    }
}

for value in EstimateItemStatus.allCases {
    print(value)
}


Swift 4.2用

いいえ、あなたは enum に問い合わせることはできません。参照 この記事 . あなたは、あなたが持っているすべての値をリストする配列を定義する必要があります。また、Frank Valbuena氏の解決策も参照してください。 すべてのenum値を配列として取得する方法 を参照してください。

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

    static let allValues = [Pending, OnHold, Done]

    init?(id : Int) {
        switch id {
        case 1:
            self = .Pending
        case 2:
            self = .OnHold
        case 3:
            self = .Done
        default:
            return nil
        }
    }
}

for value in EstimateItemStatus.allValues {
    print(value)
}