Kesetaraan pada enum typedef Objective-C di Swift

Saya sedang bekerja dengan Facebook Objective-C SDK di Swift dan saya mencoba membandingkan nilai FBSessionState dengan nilai dari enum. Namun saya mendapatkan kesalahan kompiler:

Tidak dapat menemukan kelebihan untuk '==' yang menerima argumen yang diberikan

Saya pada dasarnya mencoba untuk mencapai:

if state == FBSessionStateOpen { ... }

Saya dapat menyiasatinya dengan membandingkan nilainya...

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

Tapi saya bertanya-tanya apakah ada cara untuk membuat ini berfungsi lebih seperti enum Swift?


person Denny Ferrassoli    schedule 10.06.2014    source sumber
comment
Coba if state == .FBSessionStateOpen   -  person Adam    schedule 10.06.2014
comment
Tidak berhasil, menurut dokumen Swift ini seharusnya berhasil tetapi tampaknya enum tidak dibuat dengan makro NS_ENUM. Kesalahannya adalah: Tidak dapat menemukan anggota 'FBSessionStateOpen'   -  person Denny Ferrassoli    schedule 10.06.2014


Jawaban (4)


Anda dapat membuka enum dan konstanta dengan '.value' untuk mendapatkan bilangan bulat yang mendasarinya, yang harus dapat dialihkan:

switch x.value {
  case Foo.value:
}

Mungkin ini adalah bug dan Apple memperbaikinya di rilis mendatang.

person Nikolai Nagornyi    schedule 22.06.2014

Dengan pembaruan Beta4, solusi .value tidak lagi berfungsi. Tampaknya tidak ada solusi mudah lainnya tanpa mengubah SDK Facebook.

Saya mengubah semua enum Facebook untuk menggunakan makro NS_ENUM, sehingga Anda dapat menggunakan sintaks Swift enumnya.

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

Perubahan ini digabungkan ke dalam fork Facebook pgaspar, yang mencakup perbaikan lain untuk kompatibilitas Swift.

pod 'Facebook-iOS-SDK', :git => 'https://github.com/pgaspar/facebook-ios-sdk.git'
person lsw    schedule 22.07.2014
comment
Adakah petunjuk mengapa Facebook belum memperbaiki ini? Garpu Pgaspar berisiko menjadi basi karena Facebook melakukan perubahan lebih lanjut.. - person Thomas Clowes; 23.10.2014

Menambah jawaban Nikolai Nagorny, inilah yang berhasil bagi saya:

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

Swift secara otomatis memetakan enum Obj-C ke gaya struktur enumName.caseName miliknya sendiri. Misalnya, jika enum diberi nama FBSessionState dan terdapat huruf FBSessionStateOpen, maka akan dipetakan sebagai FBSessionState.Open di Swift.

Operator == akan berfungsi untuk membandingkan enum Swift.

person Erik    schedule 10.06.2014
comment
Hal ini tampaknya tidak terjadi pada FBSessionState. Menggunakan FBSessionState.Open atau bahkan FBSessionState.FBSessionStateOpen menyebabkan panggilan nama anggota atau konstruktor yang diharapkan setelah nama tipe - Saya pikir pemetaan enum hanya terjadi ketika enum didefinisikan dengan makro NS_ENUM seperti yang dinyatakan dalam dokumen developer.apple.com/ perpustakaan/prarilis/ios/dokumentasi/swift/ - person Denny Ferrassoli; 11.06.2014
comment
@DennyFerra Ah Anda mungkin benar tentang itu. Karena sebagian besar enum Obj-C hanyalah nilai integer, maka akan cukup mudah untuk membuatnya kembali di Swift dan gunakan saja itu. - person Erik; 11.06.2014