Enum defining forms in Objective-C

前端 未结 2 1570
故里飘歌
故里飘歌 2020-12-23 16:36

What is the difference between

typedef enum {
    ...
} Name;

and

enum {
    ...
};
typedef NSUInteger Name;
2条回答
  •  温柔的废话
    2020-12-23 17:30

    enum is as old as C, therefore a part of Objective-C. It is just explicit coding of an int type. It's quite useful for debugging and most newer compilers can make optimizations based on it. (Which you should totally ignore). It's most useful in making your code more readable (to anyone else, or to yourself after you've slept).

    typedef enum {
        ...
    } NameType ;
    

    would be followed by

    NameType name;
    

    and that's typically the preferred style of a typedef,

    your second example will not tie the typedef to the values you want to specify should only be of the given type.

    Note that this does not prevent you from executing

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

    but some compilers might generate a warning in that case,


    I ran across Apple's use of the following today:

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

    They do this because they really want the NSFetchedResultsChangeType to be of the type they have defined as NSUInteger. This can be an int but it can also be something else. And with values of 1, 2, 3, and 4, it's somewhat irrelevant to us what the type is. But they are coding to a different level of abstraction because they are a tools provider.

    You should never look to Apple for coding style hints. If you see something that looks like it's cleaner/better way to code, it usually is. As Kevin mentioned, API stability is of paramount importance for them.


    Edit (Jan 2013) If you have access to the WWDC 2012 Session Videos, you should watch Session 405 - Modern Objective-C 6:00-10:00. There is discussion a new syntax in the newer compiler that allows explicit sizing of a type and tight bonding of values to types. (borrowed from C++ 11)

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

提交回复
热议问题