2008-12-27 75 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中通常的編碼風格。習慣通常的編碼風格將使其他開發人員更容易獲取自己的代碼,並使其更容易從別人的代碼中學習。