2014-06-23 7 views
14

W moim Swift aplikacji, trzeba uzyskać dostęp do metody klasy o nazwie weibo() jak poniżej z Objective-CJak uzyskać dostęp do metody klasy Objective-C z języka Swift

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

mam skonfigurowany nagłówek pomostowego i próbował następujące oświadczenie:

let w = Weibo.weibo() as Weibo 

To nie działa.

AKTUALIZACJA: Rozwidlałem i naprawiłem ten problem, jak poniżej.

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

Powodem dlaczego to nie działa, ponieważ Swift traktuje + (Weibo*)weibo; jako konstruktor wygody. Od weibo jest taka sama jak nazwa klasy Weibo, chociaż sprawa jest inna. Muszę zmienić nazwę na getWeibo, aby naprawić ten problem, aby obsługiwać Swift.

Dziękuję za każdy, kto przyczynia się do tej odpowiedzi. Specjalne podziękowania dla @Anil i @David

Jake

+3

To jest metoda klasy, a nie własność. tj. 'Weibo.weibo()' – Fogmeister

Odpowiedz

18

+ (Weibo*)weibo; to metoda klasy Twojej klasy Weibo. Można uzyskać do niego dostęp w szybkich jak

let w:Weibo = Weibo.weibo() 

Ale to daje mi błąd, gdy próbowałem ('weibo' is unavailable: use object construction 'Weibo()') może być ze względu na imię i nazwisko metoda klasy są takie same. Podczas zmiany błąd nazwa metody idzie

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

To zależy od metody. Szybki kompilator traktuje go jako konstruktor wygody, dlatego pojawia się komunikat o błędzie. Jeśli tak jest, powinieneś po prostu użyć 'let w = Weibo()'. Jeśli, jak podejrzewam, jest to metoda singleton, musisz zmienić nazwę metody na someing, która nie wygląda jak konstruktor wygody. –

+0

Dzięki za pomoc, rozwinąłem repozytorium i naprawiłem je. –

+0

@ David, dzięki za wskazanie konstruktora wygody. Widziałem to wcześniej w filmie WWDC. Dzięki jeszcze raz. –

4

To nie metoda klasy nieruchomości.

więc mamy do nich dostęp jak ...

let w = Weibo.weibo() 

... myślę.

Rodzaj byłoby wywnioskować, ale można to zrobić jak ...

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

wierzę, i to będzie nadal działać.

+0

Jakiś konkretny powód głosowania w dół? – Fogmeister

1

Mam ten sam problem poprzez kod zmiany

+(instancetype _Nonnull)manager; 

należy go zmienić jak to

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

następnie można wywołać w Swift jak to

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

lub zmień nazwę tak, jak to 'code + (instancetype _Nonnull) sharedManager; ' następnie wywołaj' kod CKKNetManager.shared(). Get (kGetCompanyInfo, powodzenie: {[unowned self] (obj) w self.hideEmptyView() self.info = CKKCorpInfo.init (słownik: obj as! : AnyObject]) }) {[unowned self] (errorString) w self.showEmptyView (w: self.view, z: EmptyViewType.pageLoadFailed) } – songxing10000

0

W przypadku, gdy ktoś ma takie same problemy jak ja w przeszłości, powodem, dla którego nie mogłem uzyskać dostępu do funkcji z szybkiego, jest brak deklaracji funkcji w pliku .h (nagłówek). To było tylko w pliku .m i niedostępne z mojego szybkiego pliku.

Powiązane problemy