2015-11-17 10 views
9

Mam tę bazę kodu, która jest Objective C i Swift mix. Niektóre miejsca Swift używa Objective i vice versa. Muszę stworzyć framework teraz oparty na tej bazie kodu, ale nie chcę włączać wszystkich obiektywnych plików c do nagłówka mojego parasola. Oto mój problem:Publiczny i prywatny nagłówek parasola w Objective C

Wewnątrz mojego szkieletu nadal potrzebuję móc używać Swift z objc i vice versa; ale nie chcemy ujawniać wszystkich tych plików objc, które są używane wewnętrznie przez szybkie klasy. Nagłówek Bridging nie jest dozwolony w frameworkach, więc wszystkie nagłówki potrzebne do szybkiego pojawiania się w nagłówku parasola.

Zastanawiam się, czy możliwe jest posiadanie wszystkich nagłówków objc, wymaganych przez wewnętrzny kod SWIFT, w pliku, który byłby moim prywatnym nagłówkiem parasolowym, a wszystkie pliki, które muszę ujawnić, zostałyby umieszczone w nagłówku parasola publicznego.

Wszelkie sugestie?

+0

Witam, @ puru020, znalazłeś rozwiązanie problemu? Mam dokładnie ten sam problem i nie mogę znaleźć rozwiązania. Dzięki. – Daniel

+0

Nie mam. Wydaje się, że nie ma rozwiązania. Postanowiliśmy zachować dwie sekcje w nagłówku parasola dla publicznych i prywatnych plików .h. Po zbudowaniu architektury uruchamiamy skrypt, który wykonuje i usuwa prywatną sekcję nagłówka parasolowego. – puru020

+0

Wczoraj szukałem godziny, aby znaleźć rozwiązanie tego problemu. Głównym problemem jest ograniczenie możliwości korzystania z nagłówka pomostowego w frameworkach. W przypadku "prywatnego objc-nagłówka w Swift" natknąłem się na definicję prywatnego modułu, funkcji CLANG. Ale niestety wydaje się, że chodzi tutaj o wystawianie prywatnych nagłówków na inne frameworki, zamiast używania prywatnych nagłówków objc w Swift. Chociaż uważam, że istnieje powód problemów, ponieważ interoperacyjność wydaje się być ważna dla Apple. Byłbym wdzięczny za wyjaśnienie. –

Odpowiedz

0

Z powodzeniem używam jawnie zadeklarowanych modułów jako rozwiązania dla tego problemu dla przypadku Celu C -> Swift. Nie rozdzieliłem deklaracji modułu na osobną mapę modułu prywatnego, ale zadeklarowałem zarówno moduł ramowy, jak i jawny moduł w obrębie tej samej listy modulemap, z uwagi na obawy wyrażone w jednym z komentarzy do pytania (nie byłem pewien, czy i jak to się stało można użyć nagłówka wygenerowanego przez mapę modułu prywatnego wewnątrz tego samego frameworka).

Oto fragment z modulemap I zdefiniowanego w moim MPFoundation.framework, która zawiera wyraźne moduł MPManuscriptCompiler_Protected że importuje nagłówek "MPManuscriptCompiler+Protected.h" który nie jest zawarty w nagłówku parasolem dla ram:

framework module MPFoundation { 
    umbrella header "MPFoundation.h" 

    export * 
    module * { export * } 

    explicit module MPManuscriptCompiler_Protected { 
     header "MPManuscriptCompiler+Protected.h" 
     export * 
    } 
} 

I wtedy użyć tego modułu MPManuscriptCompiler_Protected wyraźny w moim Swift podklasy, która jest obecna w tych samych ramach tak:

import MPFoundation.MPManuscriptCompiler_Protected 

Moje rozwiązanie jest technicznie tylko rozwiązaniem: aby to zadziałało, "MPManuscriptCompiler+Protected.h" można oznaczyć w strukturze jako nagłówek poziomu prywatnego lub projektu, więc nie będzie on widoczny w nagłówku parasolki i nie będzie dostępny dla importu z nagłówkiem jego nazwa pliku. Tak więc działa to wokół konieczności uwzględnienia tego nagłówka w nagłówku parasol.

Jednak stworzony w ten sposób moduł jest publicznie dostępny w ramach i dostępny dla oczu, które nie powinny go widzieć. Nie badałem tego dalej, ponieważ praktycznie to rozwiązuje problem wystarczająco dobrze (mam jeszcze problemy, w których przypadkowo zaimportowałem ten chroniony nagłówek tam, gdzie nie powinno się go importować).

+0

Czy to powstrzymuje klienta twojego frameworku przed zaimportowaniem twoich prywatnych klas tak, jak zrobiłeś to? To jest to, co zadziałało dla mnie: https://github.com/danieleggert/mixed-swift-objc-framework – puru020

+0

Sortowanie: sam nagłówek może być ustawiony jako prywatny zamiast publicznego (to przeczy mojej odpowiedzi - dostosuje go) ... więc w przypadku importu opartego na nagłówku nie jest dostępny. Jednak jako moduł jest dostępny w tym formularzu dla klientów zewnętrznych, co było dla mnie do przyjęcia, ponieważ nie miałem wtedy do czynienia z osobnym folderem i oddzielną mapą modułu i dodatkowymi kluczami konfiguracji. Twoje rozwiązanie brzmi jednak bardziej poprawnie. – mz2

Powiązane problemy