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