Obj C - 随机@property错误

时间:2008-12-27 18:44:04

标签: objective-c

目标C还是新手,我遇到了一些麻烦,我似乎无法自己解决。对于下面的前三个@properties中的每一个,错误发生两次,并且是: 错误:“之前的语法错误”)'token“。

#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

提前感谢您的帮助!

3 个答案:

答案 0 :(得分:3)

我在这里看到了一些需要清理的东西,但最明显的错误是你将原始类型(如int和float)视为指针(你也应该使用NSInteger和CGFloat,但那是不那么重要)。您将需要更改大量代码,因此在担心其他任何问题之前先解决此问题。这里的a C tutorial可以帮助您了解原始类型和指针之间的区别。

答案 1 :(得分:3)

关于此代码的更多内容:

  • ;指令后面有分号#import。这是一个预处理程序指令,而不是语句,因此不需要(也永远不会)终止分号。

  • 您正在撰写elseif而不是else if。 Objective-C中没有elseif个关键字,只有if个关键字和else个关键字。

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

  • 您有一个也有返回值的setter。不要那样做。

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

通常,在编写Objective-C代码时,您应该尝试使用与框架头文件和示例相同的样式编写。例如,您在方法参数/返回类型和方法名称的一部分之间放置了空格;这不是Cocoa中常用的编码风格。习惯于通常的编码风格将使其他开发人员更容易选择自己的代码,并使您更容易从其他人的代码中学习。

答案 2 :(得分:1)

您在setter属性上使用了错误的选择器。完整选择器名称包括末尾的冒号:setNumberOfSides:

他们应该是这样的:

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

但有一点,您指定的名称与自动生成的名称相同,因此您无需指定setter属性。