كسكودي يبدو أنها لا تريد أن تشمل صفي
-
22-07-2019 - |
سؤال
لدي فئة تسمى MazeCell التي أعلنت في "MazeCell.ساعة"
#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
كسكودي تحافظ عرض تحذيرات مثل "warning: 'MazeView' may not respond to '-left'"
على كل الطرق.الشيء المضحك هو أن الكود يعمل بشكل جيد على جهاز محاكاة ، إنه فقط كسكودي لا يعرف الطرق.
لقد كان المحتوى تجاهل الرسائل حتى كسكودي لن اسمحوا لي أن استخدام MazeCellEdgeWall
لأنه لم يكن قد أعلن في وقت سابق (كل هذه التحذيرات والأخطاء في فئات مختلفة).
لذلك أنا أتساءل عما إذا كان أي شخص يرى أي الصارخ الأخطاء التي كنت قد أخطأت لأن انا جديد على البرمجة بشكل عام.
تحرير: لم أكن في الأصل تشمل رمز لأنه طويل ولكن هنا هو رمز العطاء الأخطاء.
هنا هو "MazeCell.م":
#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
مرة أخرى, هذا بشرط أن يثبت أن لدي ترميز الأشياء.يعمل هذا البرنامج و كما قلت المتاهة الخلية أساليب فعلا العمل ، إنه فقط كسكودي يعطيني التحذيرات التي لا تهتم إلا أنه يقول لم يعرف MazeCellEdgeExit و حتى لا تجمع بعد الآن, ولكنها لا تجمع على خلاف ذلك.
الآن هذا أمر غريب جدا.لكني اكتشفت أن تكرار MazeCell.ح و MazeCell.m الملفات و إعادة تسميتها إلى MzCell.ح و MzCell.م ، ثم استبدال كل إشارة إلى MazeCell مع MzCell حصلت على هذا البرنامج لتشغيل.
على الرغم من أن يفتح أسئلة أكثر من الأجوبة عليه...
المحلول
كل شيء يبدو جيدا بالنسبة لي.محاولة نظيفة و بناء.فمن الممكن جدا أن عفا عليها الزمن كائن الملفات تطوف ، مربكا المترجم أو رابط.
لم أكن قادرة على الكشف عن الخلل الذي من شأنه أن يمنع تجميع, على الرغم من أن هناك عدد من ظاهرة تسرب الذاكرة ، مثل في setMaze:حيث لم يكن الإصدار القديم المتاهة.(أنت بالتأكيد تخصيص متاهة في initWithFrame:لذا تسرب على الأقل هذا واحد.) أيضا ، الافتراضي اضع الدلالي هو "تعيين" لا "الاحتفاظ" أو "نسخة" — في هذه الحالة ، يبدو أن واحدة من الأخيرتين السلوكيات من شأنها أن تجعل أكثر منطقية.أنا أدرك أنك جديدة على الهدف-C, لذلك هذه هي يعني عن طريق التغذية الراجعة البناءة ، وليس النقد.:-)
نصائح أخرى
يمكنك إهمال إدراج التعليمات البرمجية هذا في الواقع توليد تحذيرات لكن يبدو أينما كان ، لم المستوردة MazeCell.ح رأس الملف.
فمن الممكن أن الكائن ('MazeView') أنت الوك و التعرف على الحرف الأول يعود إلى فترة قد لا يكون 'MazeCell' الكائن.هذا قد يكون ناجما عن إهمال استيراد MazeCell.ح كما تشاك ذكر أو ببساطة إنشاء 'MazeView' الكائن مع الصف الخطأ ربما نتيجة نسخ و لصق التعليمات البرمجية الخاصة بك (مجرد تخمين ، كما يبدو غير بديهية لخلق كائن من MazeCell نوع و اسم 'MazeView').
أظن أيضا ، وإن لم يكن لديك الوصول الآن إلى كسكودي لاختبار الخاص بك typedef قد أعلن بشكل غير صحيح (أو أنا ببساطة لم تكن مألوفة مع أن الجملة نمط).حاول استبدال الخاص بك 6 خطوط الرموز المميزة ل typedef مع هذا.
typedef enum {
MazeCellEdgeWall = 0,
MazeCellEdgeGate = 1,
MazeCellEdgeExit = 2
} MazeCellEdge;
تحرير: منذ لديك فقط شملت تنفيذ الملف, لقد لاحظت أن يفعل MazeView (سطر 7), ولكن الأصلي الخاص بك ملف الرأس هو MazeCell.وذلك من الآن, كنت في الواقع لم أكتب أي رمز (أو عدم نشر أي) التي هي في الواقع عن MazeCell الكائن.
أنا أيضا الشك في أنك لم @تجميع رائد (أو مكتوبة أساليب منهم) أي من المتغيرات سبيل المثال.