簡體   English   中英

枚舉在Objective-C中定義表單

[英]Enum defining forms in Objective-C

有什么區別

typedef enum {
    ...
} Name;

enum {
    ...
};
typedef NSUInteger Name;

如果功能相同,那么第二種形式的優點是什么? 這不是不必要的混亂嗎?

enumC一樣古老,因此是Objective-C的一部分。 它只是int類型的顯式編碼。 它對調試非常有用,大多數新編譯器都可以根據它進行優化。 (你應該完全忽略)。 它最有用的是使你的代碼更具可讀性(對於任何其他人,或在你睡覺后對你自己)。

typedef enum {
    ...
} NameType ;

接下來會是

NameType name;

這通常是typedef的首選樣式,

您的第二個示例不會將typedef綁定到您要指定的值,只應該是給定的類型。

請注意,這不會阻止您執行

name = 10244; // some non-valid value not listed in the enumeration

但在某些情況下,某些編譯器可能會生成警告,


今天我遇到了Apple對以下內容的使用:

enum {
NSFetchedResultsChangeInsert = 1,
NSFetchedResultsChangeDelete = 2,
NSFetchedResultsChangeMove = 3,
NSFetchedResultsChangeUpdate = 4
};
typedef NSUInteger NSFetchedResultsChangeType;

他們這樣做是因為他們真的希望NSFetchedResultsChangeType屬於他們定義為NSUInteger的類型。 可以是一個int但它也可以是其他東西。 並且值為1,2,3和4,這與我們的類型有點無關。 但是他們編碼到不同的抽象層次,因為它們是工具提供者。

你永遠不應該向Apple尋求編碼風格的提示。 如果你看到的東西看起來更干凈/更好的編碼方式,通常是。 正如Kevin所說,API穩定性對他們來說至關重要。


編輯(2013年1月)如果您有權訪問WWDC 2012會話視頻,則應觀看Session 405 - Modern Objective-C 6:00-10:00。 在較新的編譯器中討論了一種新語法,它允許顯式調整類型大小並將值緊密綁定到類型。 (借用C ++ 11)

enum NSFetchedResultsChangeType : NSUInteger {
NSFetchedResultsChangeInsert = 1,
NSFetchedResultsChangeDelete = 2,
NSFetchedResultsChangeMove = 3,
NSFetchedResultsChangeUpdate = 4
};

前者定義了一個類型名稱來引用枚舉。 這是大多數枚舉在C中命名的方式。后者雖然有點不同,但它在Cocoa框架中很流行。 使用后者有兩個原因。 第一個是如果你的枚舉定義了一個位域,你在這里想要它,因為當你提供一個“名稱”值時,你將提供枚舉值的組合。 換句話說,如果你說的話

[self doSomethingWithBitfield:(Enum1 | Enum2)]

你沒有傳遞Name的值,而是傳遞一個兩者組合的整數。

但是,Cocoa框架甚至對非位域值也使用這個習慣用法,原因很簡單:API穩定性。 根據C標准,枚舉的底層整數類型需要能夠包含枚舉中的所有值,但是編譯器會另外選擇。 這意味着添加新的枚舉值可以改變枚舉的整數類型(例如,添加-1可以使其簽名,增加60億可以使其成為長整數等)。 從API穩定性的角度來看,這是一件壞事,因為采用此枚舉值的方法的類型編碼可能會意外地更改並可能破壞現有代碼和二進制文件。 為了防止這種情況,Cocoa框架通常將類型定義為NSUInteger(如果需要負數,則為NSInteger),因此API和類型編碼保持穩定。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM