2014-06-10 18 views
19

ho bisogno di definire un protocollo che può essere chiamato in una classe che utilizzare alcuni Objective-C di tipoCome passare rapida enum con tag @objc

ma facendo che non funziona:

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

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

si ottiene ha error

Swift enums cannot be represented in Objective-C 

Se non metto il tag @objc sul mio protocollo che sarà in crash l'applicazione, non appena si chiama in una classe che adottano il protocollo e di ereditare da un Objective-C type class (come un UIViewController).

Quindi la mia domanda è, come dovrei dichiarare e passare il mio enum con il tag @objc?

+0

vedi la mia risposta. Sono abbastanza sicuro che il tuo problema si trova da qualche altra parte. – Sulthan

risposta

6

Le enumerazioni Swift sono molto diverse dalle enuncie Obj-C (o C) e non possono essere passate direttamente a Obj-C.

Per ovviare al problema, è possibile dichiarare il metodo con un parametro Int.

func newsCellDidSelectButton(cell: NewsCell, actionType: Int) 

e passarlo come NewsCellActionType.Vote.toRaw(). Non sarai in grado di accedere ai nomi enum da Obj-C e questo rende il codice molto più difficile.

Una soluzione migliore potrebbe essere quella di implementare l'enum in Obj-C (ad esempio, nell'intestazione del brides) perché in quel momento sarà automaticamente accessibile in Swift e sarà possibile passarlo come parametro.

EDIT

Non è necessario aggiungere @objc semplicemente di utilizzarlo per una classe Obj-C. Se il codice è pura Swift, è possibile utilizzare le enumerazioni senza problemi, consultare il seguente esempio come una prova:

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

A destra, il mio codice è pure veloce, ma si blocca, correlato alla mia altra domanda qui: http://stackoverflow.com/questions/24137090/custom-uitableviewcell-delegate-pattern-in-swift – Dimillian

+0

Avresti dovuto lasciare la tua modifica , la tua domanda risponde alla mia perfettamente, ma come hai detto tu, il mio codice è puro Swift. Ho pensato che il crash fosse dovuto al fatto che non ho aggiunto il prefisso @objc al prefisso. Ma sembra che io abbia torto. – Dimillian

+0

@ Dimillian77 Siamo spiacenti, ho apportato una modifica non valida e ho dovuto scriverlo di nuovo. – Sulthan

30

Apple ha appena annunciato oggi che Swift 1.2 (incluso con Xcode 6.3) sosterrà esporre enumerazioni di Objective-C

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

enter image description here

+1

Per informazioni: Sembra che si applichi solo alle enumerazioni di tipo Int. L'applicazione di @objc a un enum di tipo String produce il seguente errore di compilazione: "'@objc' tipo enum raw 'String' non è un tipo intero." –

+0

objc (e molte altre lingue) supportano solo enum in ints. swift è unico al riguardo – Oren

+1

Non funziona in Swift 2.0. Swift ENUM non era visibile nell'obiac – GoodSp33d