2014-06-10 11 views
19

Ich brauche ein Protokoll zu definieren, die in einer Klasse, dieWie mit @objc Tag schnelle Enum passieren

einig Objective-c-Typen verwendet genannt werden können, aber das tut, macht nicht:

enum NewsCellActionType: Int { 
    case Vote = 0 
    case Comments 
    case Time 
} 

@objc protocol NewsCellDelegate { 
    func newsCellDidSelectButton(cell: NewsCell, actionType: NewsCellActionType) 
} 

Sie erhalten er

Swift enums cannot be represented in Objective-C 

Fehler Wenn ich auf meinem Protokoll den @objc Tag nicht setzen würde es die App zum Absturz bringen, sobald es in einer Klasse genannt, die das Protokoll und erben von einem Objective-C adoptieren type class (wie ein UIViewController).

Also meine Frage ist, wie soll ich meine enum mit dem @objc-Tag erklären und weitergeben?

+0

meine Antwort finden. Ich bin mir ziemlich sicher, dass dein Problem woanders liegt. – Sulthan

Antwort

6

Schnelle Enums sind sehr verschieden von Obj-C (oder C) enums und sie können nicht direkt an Obj-C übergeben werden.

Als Workaround können Sie Ihre Methode mit einem Int Parameter deklarieren.

func newsCellDidSelectButton(cell: NewsCell, actionType: Int) 

und übergeben Sie es als NewsCellActionType.Vote.toRaw(). Sie können jedoch nicht auf die Enum-Namen von Obj-C zugreifen und es macht den Code viel schwieriger.

Eine bessere Lösung könnte darin bestehen, die Enumeration in Obj-C zu implementieren (zum Beispiel in Ihrem briding header), da sie dann automatisch in Swift verfügbar ist und als Parameter übergeben werden kann.

EDIT

Es ist nicht einfach hinzufügen @objc erforderlich, um es für eine Obj-C-Klasse. Wenn Ihr Code reine Swift ist, können Sie Aufzählungen ohne Probleme finden Sie im folgenden Beispiel als Beweis verwenden:

enum NewsCellActionType : Int { 
    case Vote = 0 
    case Comments 
    case Time 
} 

protocol NewsCellDelegate { 
    func newsCellDidSelectButton(cell: UITableViewCell?, actionType: NewsCellActionType ) 
} 

@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate, NewsCellDelegate { 

    var window: UIWindow? 

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool { 
     self.window = UIWindow(frame: UIScreen.mainScreen().bounds) 

     self.window!.backgroundColor = UIColor.whiteColor() 
     self.window!.makeKeyAndVisible() 

     test() 

     return true; 
    } 

    func newsCellDidSelectButton(cell: UITableViewCell?, actionType: NewsCellActionType) { 
     println(actionType.toRaw()); 
    } 

    func test() { 
     self.newsCellDidSelectButton(nil, actionType: NewsCellActionType.Vote) 
    } 
} 
+0

Richtig, mein Code ist pure schnell, aber es stürzt ab, im Zusammenhang mit meiner anderen Frage hier: http://StackOverflow.com/Questions/24137090/Custom-uitableviewcell-delegate-pattern-in-swift – Dimillian

+0

Sie sollten Ihre Bearbeitung verlassen haben Ihre Frage beantwortet meine Frage perfekt, aber wie Sie schon sagten, mein Code ist pure Swift. Ich nahm an, der Absturz war, weil ich es nicht mit dem @objc-Tag voranstellte. Aber klingt, als würde ich mich irren. – Dimillian

+0

@ Dimillian77 Sorry, ich habe einen ungültigen Schnitt gemacht und musste ihn erneut schreiben. – Sulthan

30

von Apple nur gab heute bekannt, dass Swift 1.2 (im Lieferumfang von Xcode 6.3) unterstützt Aufzählungen zu Objective-C auszusetzen

https://developer.apple.com/swift/blog/

enter image description here

+1

Für Info: Dies scheint nur für Aufzählungen des Typs Int gelten. Die Anwendung von @objc auf eine Enumeration vom Typ String führt zu folgendem Kompilierungsfehler: "'@objc' enum roher Typ 'String' ist kein Integer-Typ." –

+0

objc (und viele andere Sprachen) unterstützen nur Enums in Ints. swift ist in dieser Hinsicht einzigartig – Oren

+1

Hat in Swift 2.0 nicht funktioniert. Swift ENUM war in ObjC nicht sichtbar – GoodSp33d

Verwandte Themen