Obj C - Случайная ошибка @property - PullRequest
1 голос
/ 27 декабря 2008

Все еще новичок в Objective C, и у меня возникли некоторые проблемы, которые я просто не могу понять самостоятельно. Ошибка возникает дважды для каждого из первых трех @properties ниже, и это: error: "синтаксическая ошибка перед ')' 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 ]

3 голосов
/ 29 декабря 2008

Еще несколько вещей об этом коде:

  • У вас есть точка с запятой ; после директивы #import. Это директива препроцессора, а не оператор, и поэтому не требует (и никогда не будет) завершающей точки с запятой.

  • Вы пишете elseif вместо else if. В Objective-C нет ключевого слова elseif, есть только ключевое слово if и ключевое слово else.

  • Вы оба объявляете свойство (которое объявляет установщик) и метод установщика. Objective-C не нуждается в объявлении в интерфейсе класса для каждого метода, который реализует класс - и при использовании свойств объявление свойства является объявлением метода сеттера.

  • У вас есть установщик, который также имеет возвращаемое значение. Не делай этого.

  • Вы используете другой стиль кодирования, чем заголовки и примеры Cocoa.

В общем, при написании кода Objective-C вы должны пытаться писать в том же стиле, что и заголовки и примеры фреймворка. Например, вы помещаете пробел между параметрами параметра / типами возврата и частями имени метода; это не обычный стиль кодирования в Какао. Привыкание к обычному стилю кодирования поможет другим разработчикам подобрать ваш собственный код и упростит изучение чужого кода.

3 голосов
/ 27 декабря 2008

Я вижу несколько вещей, которые необходимо очистить здесь, но наиболее очевидная ошибка заключается в том, что вы рассматриваете примитивные типы, такие как int и float, как указатели (вы также должны использовать NSInteger и CGFloat, но не так критично). Вам нужно будет изменить много кода, поэтому исправьте это, прежде чем беспокоиться о чем-либо еще. Вот учебник C , который может помочь вам понять разницу между примитивными типами и указателями.

1 голос
/ 28 декабря 2008

Вы используете неправильные селекторы в свойствах вашего сеттера. Полное имя селектора включает двоеточие в конце: setNumberOfSides:

Они должны выглядеть так:

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

Тем не менее, указанные вами имена совпадают с автоматически генерируемыми именами, поэтому вам не нужно указывать атрибут setter.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...