2014-06-12 6 views
5

Mam istniejącą aplikację Sample Objective-C, która używa SDK Salesforce. Próbuję go przekonwertować, aby używać Swift w jednej klasie na raz. Salesforce SDK ma klasę o nazwie "SFRestRequest.h", która ma delegata "SFRestDelegate".Próba użycia metody delegatów napisanej w Objective-C w Swift rzuca "Nie można znaleźć deklaracji protokołu"

W Objective C, mam klasy o nazwie "RootViewController.h", która jest podklasą UITableViewController. Implementuje SFRestDelegate. To działa dobrze.

//RootViewController.h 
#import <UIKit/UIKit.h> 
#import "SFRestAPI.h" 

@interface RootViewController : UITableViewController <SFRestDelegate> { 

    NSMutableArray *dataRows; 
    IBOutlet UITableView *tableView;  

} 

Próbuję utworzyć plik RootVC.swift zastąpić RootViewController Objective-C klasy.

Mam pomostowego plik nagłówka, który importuje wszystkie te nagłówki, które są importowane w Objective-C

//SwiftForce-Bridging-Header.h 
#import "SFRestAPI.h" 
#import "SFRestRequest.h" 

Mój plik RooVC.Swift wygląda następująco:

import UIKit 

class RootVC: UITableViewController,SFRestDelegate { 
.. 
.. 
} 

Teraz, gdybym Command + kliknij na SFRestDelegate, poprawnie przechodzi do implementacji protokołu. Jednakże, jeśli staram się budować, mam .. "nie można odnaleźć protokół deklaracja SFRestDelegate błąd

SWIFT_CLASS("_TtC10SwiftForce6RootVC") 
@interface RootVC : UITableViewController <SFRestDelegate> 
@property (nonatomic) NSArray * dataRows; 
- (instancetype)initWithStyle:(UITableViewStyle)style OBJC_DESIGNATED_INITIALIZER; 
- (void)viewDidLoad; 
- (void)didReceiveMemoryWarning; 
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView; 
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section; 
@end 

wdzięczni za każdą pomoc można przetestować pobierając aplikację z:. https://github.com/rajaraodv/SwiftForce

+0

Czy MytDelegate jest literówką? – Dash

+0

Nie. To był tylko literówka, kiedy to napisałem. –

Odpowiedz

5

Właśnie wysłałem Ci prośbę o wycofanie do powiązanego repo, które rozwiązało problem.

Twój problem wydaje się być problemem w kolejności ładowania klas Swift i Objective-C i nagłówki. Musisz upewnić się, że wszystkie nagłówki wymagane przez twoje klasy Swift są kompilowane przed skompilowaniem kodu Swift. Jest to obsługiwane w prosty sposób dzięki prostym plikom .h i .m Objective-C, ale jeśli używasz bibliotek statycznych (jak w twoim projekcie), plik .pch wydaje się być najbardziej odpowiednim miejscem do importowania nagłówków, które twój kod Swift potrzebuje podczas kompilacji czas.

Dodanie tej linii do pliku SwiftForce-Prefix.pch wydaje się działać:

#import <SalesforceNativeSDK/SFRestRequest.h>

To nie wydaje się bardzo elegancki (tak jak w roztworze Bridging-header) jednak tylko czas pokaże, czy to błąd lub najlepsza praktyka.

+0

Bezwstydna wtyczka, na wypadek, gdyby ta odpowiedź zadziałała dla Ciebie: dołącz do przygody/rozmowy ze mną iz garstką moich uczniów, kiedy uczymy się razem: http://learnswift.io – johnnyclem

+0

Dziękuję za rozwiązanie. Wygląda jak błąd w nagłówku mostu do mnie, jako że bridge-header ma to zrobić, jak rozumiem. Przynajmniej nie znalazłem nic o dodaniu go do pliku prefix.pch. Dzięki jeszcze raz! BTW, twój blog jest naprawdę fajny! –

+0

Dzięki, to zadziałało dla mnie! Po prostu wiadomość dla kogoś takiego jak ja bez pliku prefiksowego w projekcie: możesz go utworzyć samodzielnie i określić w ustawieniach docelowych, utworzyć ustawienia, 'Prefix Header'. –

Powiązane problemy