2014-06-23 10 views
14

Nella mia app Swift, ho bisogno di accedere ad un metodo di classe chiamato weibo() come di seguito da Objective-CCome per accedere a un metodo di classe Objective-C dal linguaggio Swift

@interface Weibo : NSObject 
+ (Weibo*)weibo; 
@end 

Ho configurato l'intestazione bridging e provato la seguente dichiarazione

let w = Weibo.weibo() as Weibo 

Non funziona.

AGGIORNAMENTO: Ho biforcato e risolto questo problema come di seguito.

let w = Weibo.getWeibo() as Weibo // the method has been changed. 

Il motivo per cui non ha funzionato perché Swift tratta + (Weibo*)weibo; come costruttore convenienza. Dal weibo è uguale al nome della classe Weibo anche se il caso è diverso. Devo cambiare il nome in getWeibo per risolvere questo problema per supportare Swift.

Grazie per tutti coloro che hanno contribuito a questa risposta. Un ringraziamento speciale a @Anil e @ David

Jake

+3

Questo è un metodo di classe non una proprietà. vale a dire 'Weibo.weibo()' – Fogmeister

risposta

18

+ (Weibo*)weibo; è il metodo di classe della classe Weibo. Si potrebbe accedervi in ​​rapida come

let w:Weibo = Weibo.weibo() 

ma mi dà errore quando ho provato ('weibo' is unavailable: use object construction 'Weibo()') può essere causa di nome del metodo e il nome della classe sono gli stessi. Quando cambio l'errore nome di metodo va

let w:Weibo = Weibo.getWeibo() // works: method name changed 
+3

Dipende da cosa fa il metodo. Il compilatore rapido lo considera come un costruttore di convenienza, motivo per cui viene visualizzato il messaggio di errore. Se questo è il caso, dovresti semplicemente usare 'let w = Weibo()'. Se, come sospetto, si tratta di un metodo singleton, dovrai cambiare il nome del metodo in un metodo che non assomiglia a un costruttore di convenienza. –

+0

Grazie per il vostro aiuto, ho bifatto il repository e l'ho risolto. –

+0

@David, grazie per aver segnalato il costruttore di convenienza. L'ho visto nel video WWDC prima. Grazie ancora. –

4

Questo è un metodo di classe non è una proprietà.

Così si avrebbe accedervi come ...

let w = Weibo.weibo() 

... credo.

tipo sarebbe dedurre, ma si potrebbe fare come ...

let w:Weibo = Weibo.weibo() as Weibo 

credo, e sarebbe ancora funzionare.

+0

Qualche motivo particolare per il voto negativo? – Fogmeister

1

Ho lo stesso problema dal codice di cambiamento

+(instancetype _Nonnull)manager; 

si dovrebbe cambiare in questo modo

@property(nonatomic, class, strong, readonly) CKKNetManager *_Nonnull manager; 

quindi è possibile chiamare a Swift come questo

CKKNetManager.manager.get(kGetCompanyInfo, success: {[unowned self] (obj) in 

     self.hideEmptyView() 
     self.info = CKKCorpInfo.init(dictionary: obj as! [String : AnyObject]) 
    }) {[unowned self] (errorString) in 

     self.showEmptyView(in: self.view, with: EmptyViewType.pageLoadFailed) 
    } 
+0

o rinomina come questo 'code + (instancetype _Nonnull) sharedManager; ' quindi chiama' code CKKNetManager.shared(). Get (kGetCompanyInfo, successo: {[self proprietario] (obj) in self.hideEmptyView() self.info = CKKCorpInfo.init (dizionario: obj as! [String : AnyObject]) }) {[self proprietario] (errorString) in self.showEmptyView (in: self.view, con: EmptyViewType.pageLoadFailed) } ' – songxing10000

0

Nel caso in cui qualcuno abbia gli stessi problemi che avevo in passato, il motivo per cui non ho potuto accedere alla funzione da swift è perché mancava la dichiarazione della funzione nel file .h (header). Quindi era solo nel file .m e non accessibile dal mio file rapido.

Problemi correlati