ความเท่าเทียมกันของ Objective-C typedef enum ใน Swift

ฉันกำลังทำงานกับ Facebook Objective-C SDK ใน Swift และฉันกำลังพยายามเปรียบเทียบค่า FBSessionState กับค่าจาก enum อย่างไรก็ตาม ฉันได้รับข้อผิดพลาดของคอมไพเลอร์:

ไม่พบการโอเวอร์โหลดสำหรับ '==' ที่ยอมรับอาร์กิวเมนต์ที่ให้มา

ฉันกำลังพยายามทำให้สำเร็จ:

if state == FBSessionStateOpen { ... }

ฉันสามารถแก้ไขปัญหานี้ได้โดยเปรียบเทียบกับค่า...

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

แต่ฉันสงสัยว่ามีวิธีทำให้งานนี้เหมือน Swift enum มากขึ้นหรือไม่?


person Denny Ferrassoli    schedule 10.06.2014    source แหล่งที่มา
comment
ลอง if state == .FBSessionStateOpen   -  person Adam    schedule 10.06.2014
comment
โชคไม่ดีตามเอกสารของ Swift สิ่งนี้น่าจะใช้ได้ แต่ดูเหมือนว่า enum ไม่ได้ถูกสร้างขึ้นด้วยมาโคร NS_ENUM ข้อผิดพลาดคือ: ไม่พบสมาชิก 'FBSessionStateOpen'   -  person Denny Ferrassoli    schedule 10.06.2014


คำตอบ (4)


คุณสามารถแกะ enum และค่าคงที่ด้วย '.value' เพื่อรับจำนวนเต็มพื้นฐาน ซึ่งควรจะสลับได้:

switch x.value {
  case Foo.value:
}

บางทีนี่อาจเป็นจุดบกพร่องและ Apple จะแก้ไขมันในรุ่นต่อๆ ไป

person Nikolai Nagornyi    schedule 22.06.2014

ด้วยการอัปเดต Beta4 วิธีแก้ปัญหาชั่วคราว .value จะไม่ทำงานอีกต่อไป ดูเหมือนจะไม่มีวิธีแก้ปัญหาง่ายๆ โดยไม่เปลี่ยน SDK ของ Facebook

ฉันเปลี่ยน enums ของ Facebook ทั้งหมดเพื่อใช้มาโคร NS_ENUM เพื่อให้คุณสามารถใช้ไวยากรณ์ Swift ของ enums ได้

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

การเปลี่ยนแปลงเหล่านี้ถูกรวมเข้ากับ Pgaspar's Facebook fork ซึ่งรวมถึงการแก้ไขอื่นๆ สำหรับความเข้ากันได้ของ 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

เมื่อเพิ่มคำตอบของ Nikolai Nagorny นี่คือสิ่งที่ใช้ได้ผลสำหรับฉัน:

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

Swift จะจับคู่ Obj-C enums กับสไตล์โครงสร้าง enumName.caseName ของตัวเองโดยอัตโนมัติ ตัวอย่างเช่น หาก enum มีชื่อว่า FBSessionState และมีตัวพิมพ์ FBSessionStateOpen มันจะแมปเป็น FBSessionState.Open ใน Swift

ตัวดำเนินการ == จะทำงานเพื่อเปรียบเทียบ Swift enums

person Erik    schedule 10.06.2014
comment
สิ่งนี้ดูเหมือนจะไม่เกิดขึ้นกับ FBSessionState การใช้ FBSessionState.Open หรือแม้แต่ FBSessionState.FBSessionStateOpen ทำให้เกิดชื่อสมาชิกที่คาดหวังหรือการเรียกตัวสร้างหลังจากชื่อประเภท - ฉันคิดว่าการแมป enum จะเกิดขึ้นเฉพาะเมื่อมีการกำหนด enums ด้วยแมโคร NS_ENUM ตามที่ระบุไว้ในเอกสาร developer.apple.com/ ไลบรารี/รุ่นก่อนเผยแพร่/ios/เอกสาร/สวิฟท์/ - person Denny Ferrassoli; 11.06.2014
comment
@DennyFerra อ่าคุณอาจพูดถูกเกี่ยวกับเรื่องนั้น เนื่องจาก Obj-C enums ส่วนใหญ่เป็นเพียงค่าจำนวนเต็ม จึงควรสร้างมันขึ้นมาใหม่ใน Swift ได้ง่ายและใช้ค่านั้นแทน - person Erik; 11.06.2014