12

Basit olacağımı düşündüğüm bir şey üzerinde çok tuhaf bir hata alıyorum.Amaç C - Hata: 'Bir tür bekleniyor' '

#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 

Neden 'ViewController' bir tür olup olmadığını sorgular? Doğru bir şekilde uygulamış olduğum bir sınıf. Ayrıca ithal edilmiştir. eğer yardımcı olur DÜZENLEME *

İşte ViewController.m sınıftır.

#import "ViewController.h" 

@implementation ViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [[GameController sharedGameController] initializeGame:self]; 
} 

@end 
DÜZENLEME 2 **

ve ViewController.h

#import <GLKit/GLKit.h> 
#import "GameController.h" 

@interface ViewController : GLKViewController 

@end 
+2

'ViewController' nasıl tanımlanır? – Wain

+0

Bu size yardımcı olabilir, benzer soru: http://stackoverflow.com/a/9607607/1422070 – edwardmp

+0

Belki .h dosyasının içinde sınıf adını yanlış yazdınız. –

cevap

34

kullan ileri beyanname: @class ViewController;#import "ViewController.h" yerine. İthalat, Objective-C'deki başka bir başlıkta genellikle gereksizdir.

GameController'da ViewController kullanırsanız, içe aktarmayı GameController.m'ye ekleyebilirsiniz.

Büyük olasılıkla dairesel bağımlılık var.

dairesel bağımlılığı belirlemek için temel bir yoldur:

  • GameController.h ithalat ViewController.h
  • ViewController.h ithalat GameController.h bir birinci görülen in bildiriminde sırasına bağlıdır olacak

çeviri, ama belli ki birincisi önce gelmek zorunda kalacak çünkü bu durumda başlıklar hangisinin ilk önce gelmesi gerektiği konusunda hemfikir değiller.

Gerçek bir kod tabanında, birçok kaynak dosyada #import "ViewController.h" olabilir. Bu çok karmaşık bağımlılıklar yaratır. Bu bağımlılıklar ObjC'de büyük ölçüde gereksizdir - çoğu zaman bir başlıktaki ileri bildirimleri kullanabilirsiniz (ve oluşturma sürelerinizi iyileştirir).

En basit durumu açıkladım, ancak 15 başlık #import ViewController.h olduğunda ne olur? Peki, hangi başlığın bu çeviriye o dairesel bağımlılığı getirdiğini bulmanız gerekir. Bağımlılıkları iyi yönetmiyorsanız, düzinelerce (veya yüzlerce) dosyaya adım atmanız gerekebilir. Bazen, bu çeviri için önceden işlenmiş çıktıyı incelemek en kolay yoldur (örn. Rahatsız edici *.m dosya). Bağımlılıklar en aza indirilmezse, bu çıktı yüzbinlerce satır olabilir (ve oluşturma süreleriniz doğru şekilde yönetildiyse 20 veya daha fazla kat daha hızlı olabilir). Bu nedenle, dairesel bağımlılıkları bulma karmaşıklığı büyük kodlarda hızla artmaktadır; daha fazla #import ve başlıklarda #include. Başlıklardaki ileri bildirimleri kullanmak (mümkün olduğunda) bu sorunu çözmektedir.

#import "GameController.h" 
#import "ViewController.h" // << if you need it in this source 
#import "GameObject.h" // << if you need it in this source 

@implementation GameController 
... 

Sonra GameController.m

// includes 
#import <Foundation/Foundation.h> 

// forwards required by this header  
@class GameObject; 
@class GLKBaseEffect; 
@class ViewController; 

// header declarations 
@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 

GameController.h:

Örnek

Yani OP senin başlık göz önüne alındığında, gibi yazabilirsiniz aynı tedaviyi uygulayabilirsiniz ViewController.h (hangi GameController.h ithal ediyor).

+0

sınıfı için bir arabirim içerdiğinden kesinlikle bir gereklilik değil, ileri bildirim ekledim ve başlığı '.m' dosyasına aldım. Ben hala aynı hatayı alıyorum. 'Dairesel bağımlılık' konusunu biraz daha açıklıyor musunuz? – user2577959

+0

Projemin bu dairesel bağımlılığı var. Düzeltmek için nasıl giderim? – user2577959

+0

@ user2577959 örnek – justin

0

ViewController.h içinde tanımlanan sınıf arabiriminin de "ViewController" olarak yazıldığından emin misiniz?

Projemde bir ViewController.h sınıfı oluşturarak hızlı bir sınama yaptım, ancak arabirimi, içinde ViewControllers olarak yeniden adlandırdı ve sizinle aynı hatayı aldım.

+0

Sadece çift kontrol. Her şey doğru heceleniyor – user2577959

+0

ViewController bildirimlerini gönderebilir misiniz? – Sid