2015-03-03 7 views
9

Sto provando a creare un protocollo per la delega di caricamento JSON, JSONLoaderDelegate. altra mia classe, denominata JSONLoader, si suppone di inviare gli eventi a suo delegato (che implementa il protocollo JSONLoaderDelegate) come:Impossibile utilizzare la classe personalizzata in un protocollo con l'attributo @objc?

self?.delegate?.jsonLoaderdidEndWithError(self!, error: JSONLoaderError.LoadError) 

L'attuazione del JSONLoader non è così importante (imho). Tuttavia mi sembra di avere problemi per l'attuazione del protocollo, questo è il codice:

@objc protocol JSONLoaderDelegate { 

    optional func jsonLoaderdidBeginLoading(jsonLoader: JSONLoader) 
    func jsonLoaderdidEndWithError(jsonLoader: JSONLoader, error: JSONLoader.JSONLoaderError) 
    func jsonLoaderDidEndWithSuccess(jsonLoader: JSONLoader) 

} 

Questo sembra abbastanza semplice per me, ma sto ottenendo un errore:

method cannot be marked @objc because the type of the parameter cannot be represented in Objective-C.

puntato tutte le tre funzioni.

Ovviamente, se rimuovo l'attributo @objc, non è possibile utilizzare lo optional per la funzione. Mi piacerebbe davvero mantenere jsonLoaderdidBeginLoading come opzionale tho. Qualche idea/modo per risolvere questo? Grazie!

risposta

3

Ciò che i 3 metodi hanno in comune è il parametro JSONLoader, ed è quello che penso impedisca di eseguire il bridging del protocollo. Per risolvere il problema devi renderlo compatibile oggettivamente.

+0

Sì, la tua ipotesi è corretta, o almeno è così che la vedo io. Tuttavia, come posso renderlo compatibile objc? Devo semplicemente aggiungere "@objc" davanti a "class JSONLoader"? – Fygo

+0

Aggiungi @objc alla sua dichiarazione ... e correggi tutte le cose necessarie per renderlo compatibile (no generici, per esempio). Alla fine potrebbe essere l'approccio sbagliato .... solo per avere una funzione opzionale in un protocollo. È un compromesso, e spetta a te quale delle 2 opzioni è migliore (compatibile objc o nessuna funzione opzionale) – Antonio

+0

Sì, vedo che non riesco a rendere un enum compatibile @objc. Immagino che mi libererò di quell'opzionale allora. Oh bene ... Grazie per il tuo aiuto! – Fygo

1
JSONLoaderError.LoadError 

È un tipo di enumerazione? Non è possibile convertire le enumerazioni Swift nel codice Obj-C. Dovrai invece usare un int.

6

Ho affrontato questo problema perché avevo una classe MyConnection che non aveva una classe genitore. Ti piace questo.

public class MyConnection { 
} 

Non posso mettere @objc prima di questo, come ho ricevuto un avviso

Only classes that inherit from NSObject can be declared @objc

così ho cambiato la classe deve essere ereditata da NSObject. come questo

public class MyConnection: NSObject { 
} 
1

Ho avuto lo stesso errore. method cannot be marked @objc because the type of the parameter cannot be represented in Objective-C.

Ho modificato la sintassi di seguito in swift 2.0. Funziona bene ora!

@objc protocol AppModelDelegate { 
    optional func compititorList(com:[Competitor]!) 
} 

class Competitor:NSObject{ 
    var id:Int? 
    var title:String? 
} 

Nota: il tipo di classe Concorrente cambiato in NSObject che ha spianato la regola del delegato violazione

Anche nel caso di NSJSON analisi. Ho cambiato il seguente.

if (_httpStatusCode == 200) { 
    let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding) 
    var error : NSError? 
    print("responseString : \(responseString) ") 

    var service_result:NSDictionary = NSDictionary() 
    do { 
     let anyObj = try NSJSONSerialization.JSONObjectWithData(data!, options: []) as! [String:AnyObject] 
     service_result = anyObj 
    } catch let error as ErrorType { 
     print("json error: \(error)") 
    } 
}