Xcode 6 / Beta 4: używanie nagłówków mostkujących z elementami docelowymi struktury nie jest obsługiwane


132

Właśnie zaktualizowałem do Xcode 6 Beta 4 i mam framework, który stworzyłem dla Live Views w Beta 2. Z powodu kolejnego szybkiego błędu musiałem użyć trochę kodu Obj-C. Jednak podczas aktualizacji pojawia się następujący błąd:

błąd: używanie nagłówków mostkujących z elementami docelowymi struktury nie jest obsługiwane

Nie widziałem niczego w informacjach o wersji ani nie znalazłem żadnej innej ścieżki migracji. Czy ktoś jeszcze to widział i znalazł rozwiązanie?

Zdaję sobie sprawę, że Beta 3 wyeliminowała potrzebę tworzenia ram dla podglądów na żywo, ale w moim przypadku ma sens, jeśli uda mi się to uruchomić. Mogę to jednak usunąć jako rozwiązanie awaryjne, ale wolałbym użyć frameworka, jeśli nie są one całkowicie zepsute w wersji Beta 4.


„Zdaję sobie sprawę, że Beta 3 wyeliminowała potrzebę stosowania frameworków”. W jaki sposób?
hnh

2
(dla podglądów na żywo) - pod redakcją
Chris Conover,

1
Mam ten sam problem.
Simon Germain,

2
Wow, twoja mała edycja po prostu uczyniła moje życie o wiele lepszym - nigdzie nie słyszałem o tej zmianie (eliminującej potrzebę ram) i przez wiele godzin waliłem głową z tymi wszystkimi ramowymi celami podglądu na żywo. Dziękuję bardzo za to @chrisco!
yonix

Odpowiedzi:


237

Jak stwierdza błąd, mostkowanie nagłówków nie jest dozwolone w strukturach. Sekcja Importowanie kodu z tego samego celu w tej samej strukturze w dokumentacji Mix & Match zawiera wskazówki dotyczące tego. Jak mówią, musisz „W swoim pliku nagłówkowym parasolowym zaimportować każdy nagłówek Objective-C, który chcesz udostępnić w Swift”.

Jednak odkryłem, że może być również konieczne upublicznienie tych konkretnych nagłówków. W tej odpowiedzi opisano, dlaczego i jak to zrobić: Błąd kompilatora Swift: „niemodułowy nagłówek w module frameworka” .

Więc zrób to:

  1. Usuń plik nagłówkowy mostkowania.
  2. Usuń odniesienia do pliku nagłówkowego mostkowania w ustawieniach kompilacji dla struktury
  3. Dodaj niezbędne nagłówki do pliku parasolowego ([ProductName] .h)
  4. Upublicznij dołączone pliki w sekcji „Nagłówki” frameworka w „Fazach kompilacji”.
  5. Oczyść i odbuduj.

Uwaga : „Plik nagłówkowy parasolki” to plik (o nazwie [ProductName] .h), który ogólnie reprezentuje wszystkie publiczne nagłówki frameworka. Zwykle jest to tylko lista instrukcji #import do innych nagłówków zawartych w frameworku. W Xcode, jeśli otworzysz UIKit.h, zobaczysz dobry przykład pliku parasolowego.


3
Dzięki za zwięzłą odpowiedź (oznaczoną jako taka). Przeczytałem tę sekcję, ale byłem zdezorientowany co do różnicy między nagłówkiem Umbrella i Bridging.
Chris Conover

1
@ zaxy78 zapoznaj się z sekcją „Importowanie Swift do Objective-C” tego dokumentu: developer.apple.com/library/ios/documentation/Swift/Conceptual/…
DeepFriedTwinkie

4
@DeepFriedTwinkie, jaki plik parasolowy masz na myśli, mówiąc: „Dodaj niezbędne nagłówki do pliku parasolowego”? Dzięki.
Allan Macatingrao

2
Właśnie tego potrzebowałem. Poprawką było dodanie ich do sekcji publicznej.
olivaresF

20
Czy mam rację, zakładając, że wszelkie klasy, które chcę zachować jako prywatne w moim frameworku, a które muszą być używane przez klasę swift, muszą być teraz upublicznione dla każdego, kto używa mojego frameworka? Nie wydaje się idealnym rozwiązaniem.
ospr

30

Są dwie możliwości. Dodanie niezbędnych nagłówków do pliku nagłówkowego parasolki i upublicznienie ich jest jednym ze sposobów. Jest to jednak problem, jeśli nagłówki powinny być dostępne dla Swift, ale nie powinny być publiczne.

Druga możliwość, która udostępni wewnętrzne nagłówki Swift, jest szczegółowo opisana tutaj . Zasadniczo należy utworzyć mapę modułów podobną do poniższej:

module AwesomeKitPrivate {  
  header "../InternalClass.h"
  export *
}

Można to następnie uwzględnić w XCode przy użyciu ustawienia:

SWIFT_INCLUDE_PATHS = $(SRCROOT)/AwesomeKit/ProjectModule  

2
Świetny! Dzięki. Znacznie preferowana technika niż upublicznianie wszystkich nagłówków.
David H

Sugerujemy rozwiązanie wobec innych i patrzeć link podany na szczegółowe rozwiązania
Tancrede Chazallet

To jest właściwa odpowiedź, imo, ale w zależności od tego, co próbujesz osiągnąć, możesz uciec z użyciem niektórych makr dostarczonych przez Apple, które bardzo pomagają we współpracy z Swift-Objc: developer.apple.com/documentation/swift/ …
Joe Susnick

headerOświadczenie akceptuje ścieżkę względną. Co robisz, gdy chcesz dodać nagłówki innego frameworka?
Georgios

13

Zobacz Importowanie Objective-C do Swift .

Aby zaimportować kod Objective-C do Swift z tej samej struktury

  1. W obszarze Ustawienia kompilacji, w Pakowanie, upewnij się, że ustawienie Definiuje moduł dla tego celu struktury jest ustawione na „Tak”.
  2. W pliku nagłówka parasolowego zaimportuj każdy nagłówek Objective-C, który chcesz udostępnić w Swift. Na przykład:

        #import „XYZ / XYZCustomCell.h”
        #import „XYZ / XYZCustomView.h”
        #import „XYZ / XYZCustomViewController.h”
    
  3. Upublicznij dołączone pliki w sekcji „Nagłówki” frameworka w „Fazach kompilacji”.

  4. Oczyść i odbuduj.

Swift zobaczy każdy nagłówek, który ujawnisz publicznie w nagłówku parasola. Zawartość plików Objective-C w tej strukturze będzie dostępna w dowolnym pliku Swift w tej strukturze docelowej automatycznie, bez żadnych instrukcji importu. Użyj własnego kodu Objective-C z tą samą składnią Swift, której używasz z klasami systemowymi.

let myOtherCell = XYZCustomCell()
myOtherCell.subtitle = "Another custom cell"

Ważne: „parasolowy plik nagłówkowy” oznacza plik {ModuleName} .h. BTW, nazwa docelowa to {ModuleName} .framework.


1
Chcę używać plików objc w pliku Swift modułów, ale nie chcę udostępniać ich innym modułom. Jak mogę to zrobić?
Sazzad Hissain Khan

0

W moim przypadku pomogło samo usunięcie Objective-C Bridging Headerustawienia z mojego frameworka Build Settings.

wprowadź opis obrazu tutaj

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.