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?
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
@ 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'' –