2008-12-27 77 views
1

仍然是Objective C的新手,并且我遇到了一些麻烦,我似乎无法自己弄清楚。对于以下前三个@properties中的每一个,错误都会发生两次,并且是: 错误:“之前的语法错误”)“令牌”。Obj C - 随机@property错误

#import <Foundation/Foundation.h>  

@interface PolygonShape : NSObject { 
    int *numberOfSides; 
    int *minimumNumberOfSides; 
    int *maximumNumberOfSides; 
} 

@property (setter = setNumberOfSides) int *numberOfSides; 
@property (setter = setMin) int *minimumNumberOfSides; 
@property (setter = setMax) int *maximumNumberOfSides; 
@property (readonly, getter = angleInDegrees) float *angleInDegrees; 
@property (readonly, getter = angleInRadians) float *angleInRadians; 
@property (readonly, getter = name) NSString *name; 

- (id) init; 
- (id) initWithSides: (int*) sides min: (int*) min max: (int*) max; 
- (void) dealloc; 
- (BOOL) setNumberOfSides: (int*) num; 
- (void) setMin: (int*) num; 
- (void) setMax: (int*) num; 
- (void) description; 
- (float*) angleInDegrees; 
- (float*) angleInRadians; 
- (NSString*) name; 

@end 

不知道这是否会有所作为,但这里是执行的汇总版本:

#import "PolygonShape.h"; 

@implementation PolygonShape 

@synthesize numberOfSides; 
@synthesize minimumNumberOfSides; 
@synthesize maximumNumberOfSides; 

... 

- (BOOL) setNumberOfSides: (int*) num { 
    if(num > minimumNumberOfSides && num < maximumNumberOfSides) { 
     [numberOfSides release]; 
     numberOfSides = [num retain]; 
     return YES; 
    } else { 
     NSLog(@"Number %i is out of range %i to %i", num, minimumNumberOfSides, maximumNumberOfSides); 
     return NO; 
    } 
} 

- (BOOL) setMin: (int*) num { 
    if(num > 2 && num <= maximumNumberOfSides) { 
     [minimumNumberOfSides release]; 
     minimumNumberOfSides = [num retain]; 
     return YES; 
    } elseif (num > 2 && maximumNumberOfSides == nil) { 
     [minimumNumberOfSides release]; 
     [self setMax: 12]; 
     minimumNumberOfSides = [num retain]; 
     return YES; 
    } elseif (num > 2) { 
     NSLog(@"Polygons must have more than 2 sides."); 
     return NO; 
    } else { 
     NSLog(@"Please enter a number less than or equal to %i, the current maximum", maximumNumberOfSides); 
     return NO; 
    } 
} 

- (void) setMax: (int*) num { 
    if(num <= 12 && num < maximumNumberOfSides) { 
     [maximumNumberOfSides release]; 
     maximumNumberOfSides = [num retain]; 
    } elseif (num <= 12) { 
     NSLog(@"Please enter a number less than or equal to 12"); 
    } else { 
     NSLog(@"Please enter a number greater than or equal to %i, the current minimum", minimumNumberOfSides); 
    } 
} 

... 

@end 

预先感谢您的帮助!

回答

1

您在设置属性上使用了错误的选择器。全选择的名称包括在末端结肠:setNumberOfSides:

他们应该是这样的:

虽然
@interface Foo 
@property (readwrite, setter = setNumberOfSides:) int numberOfSides; 
@end 

一件事,你指定的名称是一样的自动生成的名称,以便您不要不需要指定setter属性。这段代码

+0

太棒了!一旦我把所有的指针都弄清楚了,这是唯一需要解决的问题,而且你看起来很明显。非常感谢。 – bloudermilk 2008-12-29 06:27:50

3

我在这里看到了一些需要清理的东西,但最明显的错误是你将原始类型(如int和float)当作指针(你也应该使用NSInteger和CGFloat,但是这并不重要)。你将需要改变很多代码,所以在解决这个问题之前,不要担心其他问题。这里的a C tutorial可能会帮助您了解基本类型和指针之间的区别。

+0

谢谢你的帮助。我对Cocoa如何使用对象的想法非常歪曲。阅读一些C教程并询问关于Obj C对象的更多问题可以帮助你点击一下。 – bloudermilk 2008-12-29 06:26:29

3

一些事情:

  • 你有#import指令后分号;。这是一个预处理指令,而不是语句,因此不需要(也不会有)终止分号。您正在编写elseif而不是else if。 Objective-C中没有elseif关键字,只有if关键字和else关键字。

  • 你们都声明了一个属性(声明了一个setter)和setter方法。 Objective-C不需要为类实现的每种方法在类的接口中声明 - 并且在使用属性时,属性声明设置方法声明。

  • 你有一个setter也有一个返回值。不要这样做。

  • 您使用的编码风格与Cocoa标题和示例不同。

一般来说,写Objective-C代码时,你应该尝试在相同的风格框架头和例子来写。例如,您在方法参数/返回类型和方法名称的部分之间放置空格;这不是Cocoa中通常的编码风格。习惯通常的编码风格将使其他开发人员更容易获取自己的代码,并使其更容易从别人的代码中学习。