2016-03-24 13 views
5

W moim projekcie mam rozszerzenia Swift nad Objective C, które działały znakomicie w Xcode 7.2.Xcode 7.3 niezadeklarowany typ dla Obj C enum w kodzie Swift

Ale z Xcode 7.3 nie powiedzie się z "niezadeklarowanym typem" w pliku Swift, w którym przedłużam obumenie.

Zbudowałem przykładowy projekt, który kompiluje i działa dobrze, ale nie mogę sprawić, by istniejący projekt zaakceptował przedłużenie w stosunku do Obj C enum.

UPDATE:

Po ponownej instalacji Xcode 7.2 Mogę potwierdzić, że projekt kompiluje i buduje pomyślnie.

Po uruchomieniu w Xcode 7.2, próbowałem ponownie uruchomić ten projekt w Xcode 7.3 i ponownie ten sam problem -> nie można zbudować rozszerzenia Swift nad obj C.

Po wyczyszczeniu i usunięciu wyprowadzonych danych w Xcode 7.3 otrzymuję również błąd brakujący nagłówka -Swift.h, ponieważ klasy Swift nie zostały skompilowane, więc nagłówek nie został jeszcze utworzony.

Kod wyjaśnienie:

My Obj C enum wewnątrz "FriendRequestResult.h":

typedef NS_ENUM(NSInteger, FriendStatus) 
{ 
    FriendStatusRequestedByUser = 1, 
    FriendStatusRequestedByOtherUser, 
    FriendStatusFriends, 
    FriendStatusBlocked, 
    FriendStatusNone, 
    FriendStatusError, 
}; 

Teraz, zgodnie z oczekiwaniami w moim AppName-pomostowe header.h mam:

#import "FriendRequestResult.h" 

Następnie mam szybkie rozszerzenie przez FriendStatus, który buduje się w Xcode 7.2, ale kończy się niepowodzeniem z "użyciem niezadeklarowanego typu" w Xcode 7.3:

extension FriendStatus 
{ 
    init(stringValue : String?) 
    { 
     if let stringValue = stringValue 
     { 
      switch stringValue 
      { 
       case "REQUESTED_BY_USER": self = .RequestedByUser 
       case "REQUESTED_BY_OTHER": self = .RequestedByOtherUser 
       case "FRIENDS": self = .Friends 
       case "BLOCKED": self = .Blocked 
       default: self = .None 
      } 
     } 
     else 
     { 
      self = .None 
     } 
    } 
} 

W rzeczywistości to rozszerzenie w ramach wyliczenia ma również inne funkcje pomocnicze, ale nie powinno to w żaden sposób zmieniać problemu.

Oczywiście, jeśli rozszerzenie enum daje niezadeklarowany typ, to używanie tego typu kończy się niepowodzeniem wszędzie w kodzie Swifta z tymi samymi "niezadeklarowanymi rzeczami". Zasadniczo wyliczenie nie jest w ogóle widoczne dla części projektu Swift, nawet jeśli import odbywa się w nagłówku pomostowym.

To pytanie zostało zasadniczo zmienione z pierwszej wersji.

+0

Czy chcesz udostępnić próbkę kodu? – Laurent

+0

@JohnDifool, spróbuję ... ale w tej sytuacji wydaje się skomplikowane, aby mieć pewność, że podzieliłeś odpowiednie części. – Fawkes

+0

Stworzyłem nowy projekt hybrydowy z twoim typedef NS_ENUM (NSInteger, FriendStatus) 'w pliku nagłówkowym Objective-C i twoim' extension FriendStatus' w pliku Swift. Kompiluje się dobrze. Czy możesz mi powiedzieć, jak uzyskać błąd? – matt

Odpowiedz

8

Rozwiązanie 1: Przeniesiono wyliczenie w pliku nagłówkowym seaparate.

Moja deklaracja wyliczeniowa była w tym samym nagłówku co nagłówek klasy, a konkretnie znajdowała się pomiędzy @interface i @end tej klasy.

W Xcode 7.2 nie powodował żadnych problemów i parsowanie nagłówka zakończyło się sukcesem, podczas gdy w Xcode 7.3 prawdopodobnie coś zoptymalizowano i zmieniono sposób, w jaki jest on parsowany, więc widziałem moją klasę, ale nie wyliczałem w niej [ może deklaruje to jako prywatne, jeśli znajduje się w deklaracji klasy]

Rozwiązanie 2: Przeniesiono deklarację enum poza zasięg @end @end.

1

Aby odpowiedzieć na pytanie: "Czy mogę w jakiś sposób zmusić Xcode do wygenerowania nagłówka Swift? Czy mogę wymusić na Xcode przekonanie, że moje wyliczenia istnieją gdzieś i że powinien on zatwierdzić moje rozszerzenia?"

Znalazłem 2 sposoby na zamówienie kompilacji plików.

  1. Użycie celu i uzależnienie go od projektu.
  2. Otwarcie pliku project.pbxproj i ręczne edytowanie listy.

W zależności od poziomu ryzyka i złożoności, z którymi chcesz się zmierzyć, wybierz jedną lub drugą.

Po prostu próbowałem rozszerzyć ENUM i wszystko działa dobrze tutaj.Jedną z kwestii, które miałem w przeszłości, było zrozumienie konwencji rozbierania nazw między Obj-C a Swift, ale nie wygląda to na problem, na który się natknąłeś. Innym problemem, który napotykam niezmiennie, jest ciągłe przechowywanie pliku @ # $% Bridging-Header.h. Czy jesteś pewien, że to jest aktualne?

+0

Niestety, myślę, że będę musiał przeformułować pytanie. Z moich dalszych badań wynika, że ​​rozszerzenia w stosunku do Obj C nie działają z Swift 2.2 i Xcode 7.3, ale badam w tej chwili. Teraz nie wydaje się to związane z faktem, że nagłówek nie jest generowany, ale raczej, że obj C może być reprezentowany inaczej teraz w nagłówku Swift niż wcześniej [z Swift 2.2 i Xcode 7.3] – Fawkes

+0

Wróć do podstawowego i spróbuj zbudować od zera prosty przykład. Właśnie to zrobiłem i aby potwierdzić, wszystko działa tak, jak powinno. Powodzenia! – Laurent

+1

Tak, właśnie skończyłem moją próbkę i działa tak, jak ty również to potwierdziłeś. – Fawkes