Копирование хеша и необработанных значений ENUM в словарь - PullRequest
0 голосов
/ 01 декабря 2018

Есть ли способ скопировать все значения перечисления в словарь без опроса их в любом цикле FOR ?

Например, из этого перечисления:

enum FruitPriority: String {
    case PEARS
    case ORANGES
    case APPLES
}

для вызова какой-то одной функции из ENUM, что-то вроде этого:

var fruitPriorityArray: [String : Int] = FruitPriority.someFunction()

и получение этого результата (отсортировано по значению хеша) :

["PEARS": 0, "ORANGES": 1, "APPLES": 2]

Предпочтение будет отдаваться только один раз для ENUM.

Спасибо.

Ответы [ 3 ]

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

Если вам нужен только один вызов перечисления:

Добавьте CaseIterable к вашему перечислению, а затем просто создайте функцию getDictionary в перечислении, которая возвращает вам словарь (для каждого случая перечисления будет rawValueназначенный key и hashValue как value)

enum FruitPriority: String, CaseIterable {

    case PEARS
    case ORANGES
    case APPLES

    func getDictionary() -> [String: Int] {
        var dictionary = [String: Int]()
        FruitPriority.allCases.forEach {
            dictionary[$0.rawValue] = $0.hashValue
        }
        return dictionary
    }

}

, тогда вы можете просто позвонить

var fruitPriorityArray: [String : Int] = FruitPriority.getDictionary()

Примечание: , если вы используетеболее ранние версии Swift вы можете увидеть this для создания CaseIterable протокола

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

Если вы сделаете свой enum CaseIterable, вы можете создать словарь, используя reduce(into:).Поскольку hashValue теперь может меняться от прогона к прогону, я бы рекомендовал использовать enumerated() для нумерации дел в следующем порядке:

enum FruitPriority: String, CaseIterable {
    case PEARS
    case ORANGES
    case APPLES
}

let result = FruitPriority.allCases.enumerated().reduce(into: [:]) { $0[$1.element.rawValue] = $1.offset }

print(result)

// ["ORANGES": 1, "APPLES": 2, "PEARS": 0]
0 голосов
/ 01 декабря 2018
enum FruitPriority: String, CaseIterable {
    case PEARS
    case ORANGES
    case APPLES
}

let result = FruitPriority.allCases.enumerated().reduce([String: Int]()) { dict, fruit in
    var dict = dict
    dict[fruit.element.rawValue] = fruit.offset
    return dict
}

print(result)

Результат:

["PEARS": 0, "ORANGES": 1, "APPLES": 2]

Для версии Swift4.1 и ранее реализация CaseIterable:

#if swift(>=4.2)
#else
public protocol CaseIterable {
    associatedtype AllCases: Collection where AllCases.Element == Self
    static var allCases: AllCases { get }
}
extension CaseIterable where Self: Hashable {
    static var allCases: [Self] {
        return [Self](AnySequence { () -> AnyIterator<Self> in
            var raw = 0
            return AnyIterator {
                let current = withUnsafeBytes(of: &raw) { $0.load(as: Self.self) }
                guard current.hashValue == raw else {
                    return nil
                }
                raw += 1
                return current
            }
        })
    }
}
#endif

Оригинал post из CaseIterable реализация.

...