2014-06-07 5 views
17

Integruję kod Swift z dużym projektem Objective-C, ale mam problemy, gdy mój kod Swift odnosi się do klas Objective-C. Na przykład załóżmy, że mam:Jak dodać odwołania do klasy do przodu używane w nagłówku -Swift.h?

  1. Klasa Objective-C o nazwie MyTableViewController
  2. Klasa Objective-C o nazwie DeletionWorkflow

I ogłosił Swift klasy następująco:

class DeletionVC: MyTableViewController { 
    let deleteWorkflow: DeletionWorkflow 

    ... 
} 

Jeśli teraz spróbuję użyć tej klasy, importując ProjectName-Swift.h do kodu Objective-C, otrzymam niezdefiniowane błędy symboli zarówno dla MyTableViewController i DeletionWorkflow.

mogę rozwiązać ten problem w tym konkretnym pliku źródłowego przez importowanie DeletionWorkflow.h i MyTableViewController.h przed importować ProjectName-Swift.h ale to nie skaluje się do dużego projektu, gdzie chcę mój Swift i Objective-C, często interakcji.

Czy istnieje sposób dodawania odniesień do klasy do ProjectName-Swift.h, aby te błędy nie wystąpiły, gdy próbuję użyć klas Swift z kodu Objective-C w mojej aplikacji?

Odpowiedz

15

To trochę głupie, ale wygląda na to, że twoje "obejście" jest zgodne z zamierzeniami firmy Apple, przynajmniej na razie. Od the interoperability guide:

Jeśli używasz własne typy Objective-C w kod SWIFT, upewnij się, aby importować nagłówki Objective-C dla tych typów przed importem Swift wygenerowany nagłówek do Objective-C .m pliku chcesz uzyskać dostęp do kodu Swift z.

W this devforums thread ktoś wspomniał, że zgłosił błąd w Radar. You probably should too.

+0

Nie byłbym zaskoczony, gdyby nigdy tego nie naprawili. Wydaje się, że jest to trudny problem, którego nie można łatwo rozwiązać za pomocą technik statycznych, takich jak mostkowanie nagłówków. Sądzę, że jedynym sposobem na pozbycie się całego mechanizmu nagłówków jest poślubienie kompilatorów Swift i Objective-C. – Echelon

16

Możesz utworzyć kolejny plik nagłówka, który forward deklaruje lub importuje niezbędne klasy, a następnie importuje ProjectName-Swift.h. Dla przykładu, utwórz plik o nazwie ProjectName-Swift-Fixed.h z treścią:

// ProjectName-Swift-Fixed.h 

// Forward declarations for property classes 
@class DeletionWorkflow; 

// Imports for superclasses 
#import "MyTableViewController.h"; 

#import "ProjectName-Swift.h" 

Następnie zamiast #import "ProjectName-Swift.h" w swoim kodzie, użyj #import "ProjectName-Swift-Fixed.h.

+0

Zdecydowanie zgadzam się, że to błąd. Mam nadzieję, że Apple wkrótce to ułatwi! – johnboiles

+0

Jest to zdecydowanie oczywiste rozwiązanie - po prostu stwórz fałszywy nagłówek parasola, tak jak w przypadku ram. Tak, mogli/powinni byli to zrobić, ale łatwo jest obejść wszystkie inne błędy, które powinny najpierw naprawić. –

+0

miał więcej szczęścia z kodowaniem #import $ (SWIFT_MODULE_NAME) -Swift.h – johndpope