그래서, "MazeCell.h"에 선언 된 MazeCell이라는 클래스가 있습니다.Xcode는 내 수업을 포함하고 싶지 않습니다.
#import <Foundation/Foundation.h>
enum {
MazeCellEdgeWall = 0,
MazeCellEdgeGate = 1,
MazeCellEdgeExit = 2
};
typedef NSUInteger MazeCellEdge;
@interface MazeCell : NSObject {
MazeCellEdge left;
MazeCellEdge right;
MazeCellEdge down;
MazeCellEdge up;
NSUInteger drawCount;
NSUInteger row;
NSUInteger column;
}
@property MazeCellEdge left;
@property MazeCellEdge right;
@property MazeCellEdge down;
@property MazeCellEdge up;
@property NSUInteger drawCount;
@property NSUInteger row;
@property NSUInteger column;
- (id)initWithLeft:(MazeCellEdge)newLeft
right:(MazeCellEdge)newRight
up:(MazeCellEdge)newUp
down:(MazeCellEdge)newDown
row:(NSUInteger)newRow
column:(NSUInteger)newColumn;
@end
Xcode는 모든 메소드에 대해 "warning: 'MazeView' may not respond to '-left'"
와 같은 경고를 계속 표시합니다. 재미있는 점은 시뮬레이터에서 코드가 제대로 실행된다는 것입니다. XCode가 메서드를 알지 못한다는 것입니다.
이전에 선언되지 않았기 때문에 XCode가 MazeCellEdgeWall
을 사용하지 못하게 될 때까지 메시지를 무시할 수있었습니다 (이러한 모든 경고와 오류는 다른 클래스에 있음).
그래서 내가 프로그래밍에 익숙하지 않았기 때문에 사람들이 빗나 갔을지도 모를 뻔뻔한 오류가 있는지 궁금합니다.
편집 : 코드가 길기 때문에 처음에는 코드를 포함하지 않았지만 여기에 오류가있는 코드가 있습니다.
여기에 "MazeCell.m"이 있습니다 :#import "MazeCell.h"
@implementation MazeCell
@synthesize left;
@synthesize right;
@synthesize down;
@synthesize up;
@synthesize drawCount;
@synthesize row;
@synthesize column;
-(id) init {
if (self = [super init]) {
right = MazeCellEdgeWall;
up = MazeCellEdgeWall;
left = MazeCellEdgeWall;
down = MazeCellEdgeWall;
drawCount = 0;
}
return self;
}
- (id)initWithLeft:(MazeCellEdge)newLeft
right:(MazeCellEdge)newRight
up:(MazeCellEdge)newUp
down:(MazeCellEdge)newDown
row:(NSUInteger)newRow
column:(NSUInteger)newColumn
{
if (self = [super init]) {
left = newLeft;
right = newRight;
up = newUp;
down = newDown;
drawCount = 0;
row = newRow;
column = newColumn;
}
return self;
}
@end
여기에 MazeView.h가 있습니다 :
#import "MazeView.h"
#import "MazeCell.h"
#import "NSMutableArray+Stack.h"
#define kCellSidesSize 80.0
@implementation MazeView
@synthesize maze;
@synthesize controller;
@synthesize interfaceOrientation;
- (id)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
interfaceOrientation = UIInterfaceOrientationPortrait;
[self setBackgroundColor:[UIColor greenColor]];
[self setUserInteractionEnabled:YES];
[self setMaze:[[Maze alloc] initWithSize:MazeSizeMake(4, 6)]];
}
return self;
}
- (void)setMaze:(Maze *)newMaze {
maze = newMaze;
CGRect newFrame = [self frame];
newFrame.size = CGSizeMake([newMaze size].width * kCellSidesSize,
[newMaze size].height * kCellSidesSize);
[self setFrame:newFrame];
}
- (void)setInterfaceOrientation:(UIInterfaceOrientation)newOrientation {
if (interfaceOrientation != newOrientation) {
interfaceOrientation = newOrientation;
CGRect oldFrame = [self frame];
[self setFrame:CGRectMake(oldFrame.origin.y, oldFrame.origin.x,
oldFrame.size.height, oldFrame.size.width)];
[[self superview] setContentSize:[self frame].size];
}
}
- (void)setController:(UIViewController *)newController {
if (controller != newController) {
controller = newController;
}
}
- (void)drawRect:(CGRect)rect {
CGContextRef context = UIGraphicsGetCurrentContext();
NSUInteger columns = [[self maze] size].width;
NSUInteger rows = [[self maze] size].height;
CGContextSetRGBStrokeColor(context, 1.0, 1.0, 1.0, 1.0);
CGContextSetLineWidth(context, kCellSidesSize - 2.0);
CGContextSetLineJoin(context, kCGLineJoinRound);
CGContextSetLineCap(context, kCGLineCapRound);
BOOL isDrawing = NO;
MazeCell *aCell;
NSMutableArray *aStack = [[NSMutableArray alloc] init];
NSUInteger row = 0;
NSUInteger column = 0;
while (YES) {
aCell = [maze getCellInRow:row andColumn:column ofOrientation:interfaceOrientation];
if (isDrawing) {
CGContextAddLineToPoint(context, row * kCellSidesSize + kCellSidesSize/2.0,
column * kCellSidesSize + kCellSidesSize/2.0);
} else {
isDrawing = YES;
CGContextMoveToPoint(context, row * kCellSidesSize + kCellSidesSize/2.0,
column * kCellSidesSize + kCellSidesSize/2.0);
}
if ([aCell left] == MazeCellEdgeExit && [aCell drawCount] < 1) {
//Warnings and errors
[aCell setDrawCount:1]; //Warning
column--;
} else if ([aCell right] == MazeCellEdgeExit && [aCell drawCount] < 2) {
//Warnings and errors
[aCell setDrawCount:2]; //Warning
column++;
} else if ([aCell up] == MazeCellEdgeExit && [aCell drawCount] < 3) {
//Warnings and errors
[aCell setDrawCount:3]; //Warning
row--;
} else if ([aCell down] == MazeCellEdgeExit && [aCell drawCount] < 4) {
//Warnings and errors
[aCell setDrawCount:4]; //Warning
row++;
} else if ([aStack count] > 0) {
aCell = [aStack pop];
row = [aCell row]; //Warning
column = [aCell column]; //Warning
isDrawing = NO;
} else {
break;
}
}
CGContextStrokePath(context);
[aStack release];
}
@end
다시 말하지만, 이것은 내가 코딩 한 것을 증명하기 위해 제공됩니다. 이 프로그램이 작동하고, 내가 말했듯이, 미로 셀 메소드가 실제로 작동하지만, Xcode가 경고를 제공한다는 것만 제외하면, MazeCellEdgeExit을 정의하지 않았으므로 더 이상 컴파일하지 않는다는 것만 제외하면 , 그렇지 않으면 컴파일됩니다.
이제 꽤 이상합니다. 그러나 MazeCell.h 및 MazeCell.m 파일을 복제하고 MzCell.h 및 MzCell.m에 이름을 바꾼 다음 MazCell에 대한 모든 참조를 MzCell로 바꾸면이 프로그램을 실행할 수 있다는 것을 알았습니다.
그 대답보다 더 많은 질문을 여는 있지만 ...
명확성을 위해 답을 형식화하고 이해했는지 확인하는 과정에서 유용하게 사용할 수있는 작은 조정을했습니다. 내가 아직 변경하지 않은 점은 Objective-C 인스턴스 변수가 객체가 생성 될 때 0으로 초기화되기 때문에 - [MazeCell init]은 거의 아무 것도하지 않는다는 것입니다. (알 수 있듯이, 0은 벽에 대한 enum 값입니다. 기본값입니다. 우연히 만 선택된 경우입니다.) –