Swift имеет тип OptionSet, который в основном добавляет операции набора к битам бит C-Style. Apple использует их довольно широко в своих рамках. Примеры включают параметр параметров в animate(withDuration:delay:options:animations:completion:)
.
На стороне плюса он позволяет использовать чистый код, например:
options: [.allowAnimatedContent, .curveEaseIn]
Однако есть и недостатки.
Если я хочу отобразить указанные значения OptionSet
, похоже, нет чистого способа сделать это:
let options: UIViewAnimationOptions = [.allowAnimatedContent, .curveEaseIn]
print("options = " + String(describing: options))
Отображает очень бесполезное сообщение:
options = UIViewAnimationOptions (rawValue: 65664)
Документы для некоторых из этих битовых полей выражают константу как значение силы двух:
flag0 = Flags(rawValue: 1 << 0)
Но документы для моего примера OptionSet, UIViewAnimationOptions
, ничего вам не говорят о числовом значении этих флагов и вычислении битов из десятичных чисел не просто.
Вопрос:
Есть ли какой-то чистый способ сопоставления OptionSet с выбранными значениями?
Мой желаемый результат будет примерно таким:
options = UIViewAnimationOptions ([. allowAnimatedContent,.curveEaseIn])
Но я не могу придумать способ сделать это без кучи беспорядочного кода, который потребовал бы, чтобы я поддерживал таблицу отображаемых имен для каждого флага.
(Я заинтересован в том, чтобы делать это как для системных фреймворков, так и для специальных наборов параметров, которые я создаю в своем собственном коде.)
Перечисления позволяют вам иметь как имя, так и необработанное значение для перечисления, но они не поддерживают функции набора, которые вы получаете с помощью OptionSets.