Objectif C - Erreur: 'attendais à un type"
Je suis un très étrange erreur sur quelque chose que j'aurais pensé pour être simple.
#import <Foundation/Foundation.h>
#import "ViewController.h"
#import "GameObject.h"
@interface GameController : NSObject
@property (strong) GLKBaseEffect * effect;
@property (strong) NSMutableArray * gameObjects;
@property (strong) NSMutableArray * objectsToRemove;
@property (strong) NSMutableArray * objectsToAdd;
+ (GameController *) sharedGameController;
- (void) tick:(float)dt;
- (void) initializeGame: (ViewController*) viewcontroller;//ERROR: EXPECTED A TYPE
- (void) createObject:(Class) objecttype atPoint:(CGPoint)position;
- (void) deleteObject:(GameObject*) object atPoint:(CGPoint)position;
- (void) manageObjects;
@end
Pourquoi serait-il question de savoir si ou de ne pas 'ViewController' est un type? C'est une classe que j'ai correctement mis en œuvre. Il a également été importés.
MODIFIER *
Voici le ViewController.m classe si ça aide.
#import "ViewController.h"
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
[[GameController sharedGameController] initializeGame:self];
}
@end
EDIT 2 **
et le ViewController.h fichier
#import <GLKit/GLKit.h>
#import "GameController.h"
@interface ViewController : GLKViewController
@end
Comment est
Cela peut vous aider, même question: stackoverflow.com/a/9607607/1422070
Peut-être à l'intérieur de l' .h fichier que vous mispelled le nom de la classe.
Pourquoi, c'est déjà inclus?
qui n'est certainement pas une exigence que le fichier nommé ViewController.h contient une interface pour la classe ViewController
ViewController
défini?Cela peut vous aider, même question: stackoverflow.com/a/9607607/1422070
Peut-être à l'intérieur de l' .h fichier que vous mispelled le nom de la classe.
Pourquoi, c'est déjà inclus?
#import "ViewController.h"
Pas besoin de le déclarer avant.qui n'est certainement pas une exigence que le fichier nommé ViewController.h contient une interface pour la classe ViewController
OriginalL'auteur user2577959 | 2013-07-12
Vous devez vous connecter pour publier un commentaire.
Utiliser une déclaration anticipée:
@class ViewController;
en place de#import "ViewController.h"
. L'importation est généralement inutile dans un autre en-tête en Objective-C.Si vous utilisez
ViewController
dansGameController
, alors vous pouvez ajouter l'importation de GameController.m.Vous avez probablement une dépendance circulaire.
La façon la plus simple de définir une dépendance circulaire est:
GameController.h
importationsViewController.h
ViewController.h
importationsGameController.h
Qui sera vu en premier dépend de l'ordre de déclaration dans la traduction, mais, évidemment, on aura d'abord parce que dans ce cas les en-têtes sont en désaccord quant à ce qui doit venir en premier.
Dans une véritable base de code, vous pouvez
#import "ViewController.h"
dans plusieurs fichiers source. Cela crée de très complexe de dépendances. Ces dépendances sont en grande partie inutiles dans ObjC, vous pouvez l'utiliser en avant les déclarations de la plupart du temps dans un en-tête (et il permettra d'améliorer votre temps de construire).Alors je lui ai expliqué le cas le plus simple, mais ce qui arrive quand 15 en-têtes
#import ViewController.h
? Ainsi, vous auriez à suivre, qui en-tête est l'introduction de la circulaire de la dépendance de cette traduction. Si vous n'avez pas de gérer les dépendances eh bien, vous peut-être l'étape à travers des dizaines (ou des centaines) de fichiers. Parfois, il est plus facile de se contenter d'examiner la séquence de sortie pour que la traduction (par exemple, la délinquance*.m
fichier). Si les dépendances ne sont pas réduites, la production pourrait être des centaines de milliers de lignes (et votre temps de construire peut être 20 fois ou plus rapidement si elle était gérée correctement). Donc, la complexité de la localisation des dépendances circulaires va vite dans de grandes bases de code; plus vous#import
et#include
dans les en-têtes. À l'aide de sa déclaration dans les en-têtes (si possible) résout ce problème.Exemple
Donc, compte tenu de l'en-tête dans l'OP, vous pouvez réécrire sous la forme:
GameController.h
GameController.m
Ensuite, vous pouvez appliquer le même traitement à ViewController.h (ce qui est de l'importation de GameController.h).
Mon projet est que la dépendance circulaire. Comment puis-je la corriger?
mis à jour avec exemple
Alors, j'ai changé tous mes importations de classe avant les déclarations et l'erreur a disparu. Ce qui se passe exactement quand je fais cela? Il est recommandé que ce est comment je gère toutes les classes de l'importation?
Voici la question fondamentale: Lorsque vous écrivez
#import something
, le compilateur est essentiellement le contenu de cettesomething
et copie-colle dans le fichier qu'il compile. Mais lorsque deux fichiers à la fois#import
les uns des autres, c'est impossible, parce que l'on a à faire avant les autres, de sorte que l'un d'eux finit par être déçu et vous obtiendrez une erreur.OriginalL'auteur justin
Êtes-vous certain que la classe de l'interface définie à l'intérieur d'
ViewController.h
est également orthographié comme "ViewController
"?J'ai fait un test rapide par la création d'un
ViewController.h
classe dans mon projet, mais renommé à l'interface deViewControllers
à l'intérieur de lui et a obtenu la même erreur que vous.Pourriez-vous poster les déclarations pour ViewController?
OriginalL'auteur Sid