Błąd "oczekiwany Typ" wskazujący Typ zwracanej metody

Próbowałem skompilować, ale za każdym razem, gdy to robię, jedna metoda wyświetla dziwny błąd "oczekiwany Typ". Mam metodę w nagłówku:

-(ANObject *)generateSomethingForSomethingElse:(NSString *)somethingElse;

Błąd wskazuje na typ zwracany dla tej metody. Zaimportowałem ANObject do nagłówka używając #import "ANObject.h" i ANObject jest dobrze skompilowany..

Dlaczego tak się dzieje?
Author: Josh Caswell, 2011-11-12

8 answers

Ma to związek z kolejnością kompilacji plików źródłowych. Prawdopodobnie już wiesz, że nie możesz wywołać metody przed jej zdefiniowaniem (patrz poniżej pseudokod):

var value = someMethod();

function someMethod()
{
    ...
}

Spowodowałoby to błąd w czasie kompilacji, ponieważ someMethod () nie została jeszcze zdefiniowana. To samo dotyczy klas. Klasy są kompilowane jedna po drugiej przez kompilator.

Więc, jeśli wyobrażasz sobie, że wszystkie klasy są umieszczane w gigantycznym pliku przed kompilacją, możesz być w stanie już zobacz problem. Spójrzmy na klasy Ship i BoatYard:

@interface BoatYard : NSObject
@property (nonatomic, retain) Ship* currentShip;
@end

@interface Ship : NSObject
@property (nonatomic, retain) NSString* name;
@property (nonatomic, assign) float weight;
@end

Po raz kolejny, ponieważ klasa Ship nie została jeszcze zdefiniowana, nie możemy się do niej odwoływać. Rozwiązanie tego konkretnego problemu jest dość proste; Zmień kolejność kompilacji i skompiluj. Jestem pewien, że jesteś familliar z tym ekranem w XCode:

Ale czy wiesz, że możesz przeciągać pliki w górę iw dół listy? Zmienia to kolejność kompilacji plików. Dlatego, po prostu przesuń klasę Ship nad klasą BoatYard i wszystko będzie dobrze.

Ale co, jeśli nie chcesz tego robić, lub co ważniejsze, co jeśli istnieje kolista relacja między tymi dwoma obiektami? Zwiększ złożoność tego diagramu obiektu dodając odwołanie do bieżącego BoatYard, w którym Ship znajduje się:

@interface BoatYard : NSObject
@property (nonatomic, retain) Ship* currentShip;
@end

@interface Ship : NSObject
@property (nonatomic, retain) BoatYard* currentBoatYard;
@property (nonatomic, retain) NSString* name;
@property (nonatomic, assign) float weight;
@end
O rany, teraz mamy problem. Tych dwóch nie można zestawiać obok siebie. Potrzebujemy sposobu na poinformowanie kompilatora, że Klasa statku * naprawdę istnieje. Oraz dlatego słowo kluczowe @class jest tak przydatne.

Mówiąc to w kategoriach laika, mówisz, "Zaufaj mi człowieku, Ship naprawdę istnieje, i zobaczysz to naprawdę szybko". Aby wszystko poskładać:

@class Ship;

@interface BoatYard : NSObject
@property (nonatomic, retain) Ship* currentShip;
@end

@interface Ship : NSObject
@property (nonatomic, retain) BoatYard* currentBoatYard;
@property (nonatomic, retain) NSString* name;
@property (nonatomic, assign) float weight;
@end

Teraz kompilator wie, że wkrótce pojawi się definicja klasy Ship. Oczywiście, jeśli nie, kompilacja nadal się powiedzie.

Słowo kluczowe @class informuje kompilator, że Klasa wkrótce się pojawi. On Nie zastąpienie #import. Nadal musisz zaimportować plik nagłówkowy, inaczej nie będziesz miał dostępu do żadnej z wewnętrznych klas:

@class Ship

-(void) example
{
    Ship* newShip = [[Ship alloc] init];
}

To nie może się udać, a zawiedzie z Komunikatem o błędzie mówiącym, że statek jest deklaracją forward. Po wykonaniu #import "Ship.h" będziesz mógł utworzyć instancję obiektu.

 92
Author: Steve Rukuts,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-07 15:09:53

Znalazłem ten błąd, gdy istnieje okrągła zależność od nagłówków. Sprawdź, czy .plik h, w którym zadeklarujesz tę metodę, jest importowany do obiektu ANObject.h

 53
Author: RENA,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-05 22:58:11

W zasadzie dodajesz

@class ANObject;

Przed @ interface!

 25
Author: JomanJi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-14 12:35:23

Więc z jakiegoś powodu otrzymywałem ten błąd podczas próby ustawienia metody z typem enum w parametrach. TAK:

- (void)foo:(MyEnumVariable)enumVariable;

Wcześniej używałem go w ten sposób i nigdy nie miałem problemu, ale teraz tak. Sprawdziłem zależność kołową i nie znalazłem żadnej. Sprawdzałem też wielokrotnie literówki i bez kości. To, co skończyło się rozwiązaniem mojego problemu, to dodanie 'enum', zanim chciałem uzyskać dostęp do zmiennej. TAK:

- (void)foo:(enum MyEnumVariable)enumVariable;
{
     enum MyEnumVariable anotherEnumVariable;
}
 4
Author: OlivaresF,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-30 04:37:20

Zazwyczaj, gdy widzę taki błąd, to dlatego, że mam literówkę w poprzedniej linii, np. dodatkowy lub brakujący nawias lub coś takiego.

 1
Author: Dave DeLong,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-12 17:54:57

Może to zabrzmieć głupio, ale źle brzmi albo źle używa wielkich / małych liter.

 1
Author: Yeung,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-07 10:03:31

Dostałem wiadomość, gdy typ zmiennej został błędnie napisany. Zobacz poniżej poniżej

Np.

-(void)takeSimulatorSafePhotoWithPopoverFrame:(GCRect)popoverFrame {

Zamiast.....

-(void)takeSimulatorSafePhotoWithPopoverFrame:(CGRect)popoverFrame {
 1
Author: sean808080,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-14 13:59:29

O dziwo, Zmiana kolejności moich importów naprawiła to w przeszłości... Spróbuj przenieść import na dół po wszystkich innych importach.

 0
Author: DranoMax,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-11 19:57:20