Равенство в перечислении типов Objective-C в Swift

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

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

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

if state == FBSessionStateOpen { ... }

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

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

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


person Denny Ferrassoli    schedule 10.06.2014    source источник
comment
Попробуйте if state == .FBSessionStateOpen   -  person Adam    schedule 10.06.2014
comment
Не повезло, согласно документам Swift, это должно было сработать, но похоже, что перечисление не было создано с помощью макроса NS_ENUM. Ошибка: не удалось найти член «FBSessionStateOpen».   -  person Denny Ferrassoli    schedule 10.06.2014


Ответы (4)


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

switch x.value {
  case Foo.value:
}

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

person Nikolai Nagornyi    schedule 22.06.2014

С обновлением Beta4 обходной путь .value больше не работает. Кажется, нет другого простого обходного пути без изменения SDK Facebook.

Я изменил все перечисления Facebook, чтобы использовать макрос NS_ENUM, чтобы вы могли использовать синтаксис Swift для перечислений.

if FBSession.activeSession().state == .CreatedTokenLoaded

Эти изменения были объединены в форк pgaspar для Facebook, который включает другие исправления для совместимости со Swift.

pod 'Facebook-iOS-SDK', :git => 'https://github.com/pgaspar/facebook-ios-sdk.git'
person lsw    schedule 22.07.2014
comment
Любая подсказка, почему Facebook до сих пор не исправил это? Форк Pgaspar рискует устаревать, поскольку Facebook вносит дальнейшие изменения. - person Thomas Clowes; 23.10.2014

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

if (device.deviceType.value == TYPE_BLUETOOTHNA.value)
person Vincil Bishop    schedule 28.11.2014

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

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

person Erik    schedule 10.06.2014
comment
Кажется, этого не происходит для FBSessionState. Использование FBSessionState.Open или даже FBSessionState.FBSessionStateOpen вызывает ожидаемое имя члена или вызов конструктора после имени типа. Я думаю, что отображение перечисления происходит только тогда, когда перечисления определены с помощью макроса NS_ENUM, как указано в документах developer.apple.com/ библиотека/предварительная версия/ios/документация/swift/ - person Denny Ferrassoli; 11.06.2014
comment
@DennyFerra Ах, ты, наверное, прав. Поскольку большинство перечислений Obj-C представляют собой просто целые значения, их должно быть довольно легко воссоздать в Swift и просто использовать вместо этого. - person Erik; 11.06.2014