Ответ 1
Вы можете развернуть перечисление и константы с ".value", чтобы получить базовое целое число, которое должно переключаться:
switch x.value {
case Foo.value:
}
Возможно, это ошибка, и Apple исправляет ее в будущих версиях.
Я работаю с SDK Facebook Objective-C в Swift, и я пытаюсь сравнить значение FBSessionState со значением из перечисления. Однако я получаю ошибку компилятора:
Не удалось найти перегрузку для '==', которая принимает предоставленные аргументы
Я по существу пытаюсь выполнить:
if state == FBSessionStateOpen { ... }
Я могу обойти это, сравнивая его со значением...
if state.value == FBSessionStateOpen.value { ... }
Но мне интересно, есть ли способ сделать эту работу более похожей на перечисление Swift?
Вы можете развернуть перечисление и константы с ".value", чтобы получить базовое целое число, которое должно переключаться:
switch x.value {
case Foo.value:
}
Возможно, это ошибка, и Apple исправляет ее в будущих версиях.
При обновлении Beta4 обходное решение .value больше не работает. Кажется, что нет другого облегченного решения без изменения SDK для Facebook.
Я изменил все перечисления Facebook, чтобы использовать макрос NS_ENUM, так что вы можете использовать синтаксис Swift для перечислений.
if FBSession.activeSession().state == .CreatedTokenLoaded
Эти изменения были объединены в pgaspar Facebook fork, который включает в себя другие исправления для совместимости Swift.
pod 'Facebook-iOS-SDK', :git => 'https://github.com/pgaspar/facebook-ios-sdk.git'
Добавив в ответ Николая Нагорного, это то, что сработало для меня:
if (device.deviceType.value == TYPE_BLUETOOTHNA.value)
Swift автоматически отображает перечисления Obj-C в собственный стиль структуры enumName.caseName
. Например, если enum
имеет имя FBSessionState
и есть случай FBSessionStateOpen
, он будет отображаться как FBSessionState.Open
в Swift.
Оператор ==
будет работать для сравнения строк Swift.