Равенство в Objective-C typedef enum в Swift

Я работаю с SDK Facebook Objective-C в Swift, и я пытаюсь сравнить значение FBSessionState со значением из перечисления. Однако я получаю ошибку компилятора:

Не удалось найти перегрузку для '==', которая принимает предоставленные аргументы

Я по существу пытаюсь выполнить:

if state == FBSessionStateOpen { ... }

Я могу обойти это, сравнивая его со значением...

if state.value == FBSessionStateOpen.value { ... }

Но мне интересно, есть ли способ сделать эту работу более похожей на перечисление Swift?

Ответы

Ответ 1

Вы можете развернуть перечисление и константы с ".value", чтобы получить базовое целое число, которое должно переключаться:

switch x.value {
  case Foo.value:
}

Возможно, это ошибка, и Apple исправляет ее в будущих версиях.

Ответ 2

При обновлении 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'

Ответ 3

Добавив в ответ Николая Нагорного, это то, что сработало для меня:

if (device.deviceType.value == TYPE_BLUETOOTHNA.value)

Ответ 4

Swift автоматически отображает перечисления Obj-C в собственный стиль структуры enumName.caseName. Например, если enum имеет имя FBSessionState и есть случай FBSessionStateOpen, он будет отображаться как FBSessionState.Open в Swift.

Оператор == будет работать для сравнения строк Swift.