2014-06-23 6 views
14

In meiner Swift App, ich brauche eine Klassenmethode weibo() aus wie unten genannt für den Zugriff auf Objective-CWie eine Objective-C-Klasse Methode von Swift Sprache zuzugreifen

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

ich die Überbrückung Header und versuchte so konfiguriert haben, die folgende Anweisung

let w = Weibo.weibo() as Weibo 

Es funktioniert nicht.

UPDATE: Ich habe gespalten und dieses Problem wie folgt behoben.

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

Der Grund, warum es nicht funktioniert, weil Swift + (Weibo*)weibo; als Bequemlichkeit Konstruktor behandelt. Seit weibo ist das gleiche wie der Klassenname Weibo obwohl der Fall anders ist. Ich muss den Namen in getWeibo ändern, um dieses Problem zu beheben, um Swift zu unterstützen.

Vielen Dank für jeden, der zu dieser Antwort beigetragen hat. Besonderer Dank geht an @Anil und @ David

Jake

+3

Das ist eine Klassenmethode keine Eigenschaft. d.h. 'Weibo.weibo()' – Fogmeister

Antwort

18

+ (Weibo*)weibo; ist die Klassenmethode Ihrer Klasse Weibo. Man konnte es in schnellen Zugriff wie

let w:Weibo = Weibo.weibo() 

Aber es gibt mir eine Fehlermeldung, wenn ich versuchte ('weibo' is unavailable: use object construction 'Weibo()') wegen der Methodenname und Klassenname kann gleich sind. Wenn ich den Namen Methode ändern Fehler

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

Es hängt davon ab, was die Methode tut. Der swift-Compiler behandelt es als Convenience-Konstruktor, weshalb Sie die Fehlermeldung erhalten. Wenn das der Fall ist, sollten Sie einfach 'let w = Weibo() 'verwenden. Wenn es sich, wie ich annehme, um eine Singleton-Methode handelt, müssen Sie den Namen der Methode in Someing ändern, der nicht wie ein Konstruktor für Bequemlichkeit aussieht. –

+0

Danke für Ihre Hilfe, ich habe das Repo gegabelt und repariert. –

+0

@David, danke für den Hinweis auf Convenience Constructor. Ich habe es vorher im WWDC-Video gesehen. Danke noch einmal. –

4

Das ist eine Klassenmethode keine Eigenschaft.

So würden Sie es zugreifen wie ...

let w = Weibo.weibo() 

... denke ich.

Typ würde geschlossen werden, aber man könnte es tun, wie ...

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

glaube ich, und es würde immer noch funktionieren.

+0

Irgendein bestimmter Grund für die Abstimmung nach unten? – Fogmeister

1

geht habe ich das gleiche Problem durch Änderung Code

+(instancetype _Nonnull)manager; 

Sie es wie dieser

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

dann können Sie in Swift nennen ändern sollte wie diese

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

oder umbenennen wie diese 'code + (instancetype _Nonnull) sharedManager; ' rufen dann' Code CKKNetManager.shared() erhalten (kGetCompanyInfo, Erfolg. {[Unowned self] (obj) in self.hideEmptyView() self.info = CKKCorpInfo.init (Wörterbuch: obj als [Zeichenfolge : AnyObject]) }) {[unowned self] (errorString) in self.showEmptyView (in: self.view, mit: EmptyViewType.pageLoadFailed) } ' – songxing10000

0

Wenn jemand die gleichen Probleme wie ich in der Vergangenheit hatte, der Grund, warum ich nicht auf die Funktion von Swift zugreifen konnte, ist, weil es die Funktionsdeklaration in der .h (Header) -Datei fehlte. So war es nur in der .m-Datei und nicht auf meine schnelle Datei zugreifen.

Verwandte Themen