2015-12-19 14 views
7

Staram się, aby mój kod był możliwie czytelny, zachowując metody i pliki tak krótkie, jak tylko mogę, i używając klas zagnieżdżonych dla przestrzeni nazw. Działa dobrze, z wyjątkiem naprawdę dziwnego momentu.Xcode widzi tylko niektóre podobne rozszerzenia klasy zagnieżdżonej napisane w oddzielnych plikach.

Mam kilka klas używanych do wyświetlania nazw.

class Space { } 

Wszystkie klasy używane w tym są zaimplementowane w ich własnych plikach jako rozszerzenia.

extension Space { 
    class SomeClass { 
     // implementation 
    } 
} 

jeden z tych SomeClasses mają szereg dość skomplikowanych incjalizatory, więc muszę podzielić je do własnych plików, jak również i realizowane w następujący sposób:

extension Space.SomeClass { 
    convenience init(fromSomeSource source: SourceClass) { 
     self.init() 
     // other implementation 
    } 
} 

Problem polega na tym, że niektóre te pliki działają dobrze, ale niektóre z nich rzucają 'SomeClass' is not a member type of 'Space' i nie wiem dlaczego.

Wszystkie są bardzo podobne. Jedyną różnicą jest implementacja samego inicjalizatora. Wszystkie pliki są przechowywane w tym samym miejscu i nie mam pojęcia, dlaczego niektóre z nich działają dobrze, a inne nie.

Próbowałem przenieść kod z niedziałających plików do plików, które działają poprawnie, a to działa - Xcode zgadza się zobaczyć kod i nie powiedział nic przeciwko niemu. Ale gdy ten sam kod leży w jego własnym pliku - Xcode lub kompilator nie chce zrozumieć, że SomeClass jest naprawdę członkiem Space.

Próbowałem wyczyścić kompilację, w tym ręczny zrzut z folderu ~/Library/Developer/Xcode/DerivedData. Nic nie pomaga.

Z pewnością mogę umieścić wszystko w jednym pliku i będzie działało dobrze, ale jaki jest powód, dla którego jest tak wybredny w moim przypadku?


Próbowałem utworzyć nowy plik i przenieść tam całą zawartość jednego z tych złych. Działa, ale tylko z określonymi nazwami plików. Niektóre nazwy dają ten sam błąd, ale wydaje się, że jeśli nazwa jest zupełnie nowa i nie jest podobna do żadnej z istniejących - działa. Magia?

+0

Piszesz: "Jedyną różnicą jest implementacja samego inicjalizatora." Jaka jest różnica?Spróbuj wyizolować różnicę i pokaż nam, co dzieje się w Twoim kodzie, łącznie z wiadomościami kompilatora. – user3441734

+0

@ user3441734 Różnica polega na tym, że mają różne typy obiektów jako argumenty dla inicjatora, więc każdy rodzaj może być traktowany na swój własny sposób. Tak jak w jednym przypadku umieszczam odpowiednią właściwość w klasie bez leczenia, w innym przypadku zmieniam jakiś ciąg w jakiś sposób. Ale problem polega na tym, że sam kod działa dobrze. Mogę umieścić go w innym pliku i zadziała. Więc kwestia jest gdzieś gdzie mogę przechowywać kod, w którym plik. To ma znaczenie. Jedyną wiadomością otrzymaną od Xcode jest ta, o której wspomniałem: '' SomeClass 'nie jest typem członka' Space'' –

Odpowiedz

3

Wystąpił podobny problem, wygląda na to, że kompilator próbuje przetworzyć plik, w którym rozszerza się zagnieżdżoną klasę przed tą, w której została zdefiniowana. Dlatego masz ten błąd, który mówi, że Space nie ma członka SomeClass.

Rozwiązaniem, które znalazłem, jest przejście do ustawień docelowych, otwórz Build Phases.

enter image description here

Tam, w Compile Sources sekcji należy umieścić plik, w którym można zdefiniować zagnieżdżonych klasa powyższe plików gdzie można przedłużyć go.


To rozwiązanie wydaje się jeszcze dobrze grać z obserwacji, że kiedy odtworzyć plik czasami kompiluje, ponieważ podczas odtworzenia plikowi swoją pozycję w Compile Sources zmian.

+0

Dziękuję, Nikita! –

Powiązane problemy