2011-10-04 32 views
2

我擔心的一個基本問題。下面的代碼工作,typedef枚舉被識別,但我得到一個警告消息「在空聲明中無用的存儲類說明符」。我在這裏做錯了什麼,這是放置typedef枚舉的最佳場所嗎?哪裏有一個typedef枚舉語句進入Objective-C?

#import <UIKit/UIKit.h> 
#import "CoreDataBaseTableViewController.h" 

typedef enum ColourType { 
    BACKGROUND=1, 
    LOW=2, 
    HIGH=3, 
    EXTRA=4 
}; 

@interface ColourList : CoreDataBaseTableViewController <NSFetchedResultsControllerDelegate> { 

    NSManagedObjectContext* moc;  
    NSFetchedResultsController* fetchedResultsController; 

    ... 

    enum ColourType colourTarget; 

} 

... 
+0

哪條線是警告指向? –

+0

得到了兩個,並且typdef的開始和結束,但是問題現在被排序。 – drw

+0

查看[NS_ENUM](http://nshipster.com/ns_enum-ns_options/)。 – piperchester

回答

11

你可以把一個枚舉Objective-C中的任何地方它是有效的C.如果你擁有了它,現在(上面的接口)是enumeratio一個共同的地方ns應該是全球可用的。警告是因爲您正在使用typedef,但實際上沒有定義類型。如果你只是想創建一個枚舉,這是沒有必要的。你只需要使用:

enum ColourType { 
    BACKGROUND=1, 
    LOW=2, 
    HIGH=3, 
    EXTRA=4 
}; 

您使用typedef定義一個類型,這使得它更容易引用常用的結構/聯合/枚舉/等類型。如果選擇這樣做,則應在枚舉定義之後爲該類型設置一個名稱,然後可以使用該名稱而不使用enum關鍵字來引用該枚舉。

typedef enum ColourType { 
    BACKGROUND=1, 
    LOW=2, 
    HIGH=3, 
    EXTRA=4 
} MyColourType; 
MyColourType colour; 

或者,您可以創建枚舉並鍵入具有相同效果的單獨命令。

enum ColourType { 
    BACKGROUND=1, 
    LOW=2, 
    HIGH=3, 
    EXTRA=4 
}; 
typedef enum ColourType MyColourType; 
+1

非常感謝。事情更清晰。在FORTRAN77中,我們沒有這些全新的好東西。 – drw

0

無論是擺脫typedef,或提供的類型的別名:因爲目標C只是一個C的超集,您必須提供一個別名

typedef enum X {...} Y; 
0

是的,它會工作得很好您枚舉像這樣:

typedef enum ColourType { 
    BACKGROUND=1, 
    LOW=2, 
    HIGH=3, 
    EXTRA=4 
} MyColourType; 
1

由此,考慮使用Objective-C的NS_ENUM宏。把它拿走, Apple Docs
::禮貌的掌聲爲AD採用的麥克風::

NS_ENUMNS_OPTIONS宏定義提供基於C的語言枚舉和選項的簡潔,簡單的方法。這些宏改進了Xcode中的代碼完成,並明確指定了枚舉和選項的類型和大小。此外,這種語法以老式編譯器正確評估的方式聲明枚舉,並由更新的可解釋底層類型信息的新語法聲明。

語法例如:

typedef NS_ENUM(NSInteger, DRWColourType) { 
    DRWColourTypeBackground, 
    DRWColourTypeLow, 
    DRWColourTypeHigh, 
    DRWColourTypeExtra 
}; 

爲什麼? NSHipster

該方法結合了上述所有方法中的優點,甚至爲編譯器提供了類型檢查和切換語句完整性的提示。