Note: The definitions shown here are not always the actual definitons and therefore might not compile.
NS_CLOSED_ENUM / CF_CLOSED_ENUM¶
Declares a frozen enum.
Declaration¶
#define NS_CLOSED_ENUM(_type, _name) CF_CLOSED_ENUM(_type, _name
#define CF_CLOSED_ENUM(_type, _name) /* ... */
Parameters¶
type name
_type
The integer type used for the values of the enum.
identifier
_name
The name of the generated typedef.
Equivalent attributes¶
Discussion¶
Use the NS_CLOSED_ENUM or CF_CLOSED_ENUM macro for a simple group of constants that you can never add new cases to. Closed enumerations are useful for representing a finite set of states that you expect people to switch over using a switch statement. Once an enum is marked as closed, it is a binary and source incompatible change to add a new value.
The three cases of NSComparisonResult—NSOrderedAscending, NSOrderedSame, and NSOrderedDescending—are an example of a finite set. They’re the only logical cases for performing an ordered comparison during tasks like sorting.
Don’t use the NS_CLOSED_ENUM or CF_CLOSED_ENUM macro if:
- You’ve ever added cases to an enumeration after its initial declaration 
- You can think of additional cases you might add later 
- The enumeration has any private cases 
In these scenarios, use the NS_ENUM or CF_ENUM macro instead.
Importing into Swift¶
- Swift >= 5 
When used in a switch statement whose last case is @unknown default:, the Swift compiler will emit a warning if not all cases of a frozen enum have not been specified. For example:
typedef NS_CLOSED_ENUM(NSInteger, GregorianMonth) {
  GregorianMonthJanuary = 1,
  GregorianMonthFebruary,
  GregorianMonthMarch,
  GregorianMonthApril,
  GregorianMonthMay,
  GregorianMonthJune,
  GregorianMonthJuly,
  GregorianMonthAugust,
  GregorianMonthSeptember,
  GregorianMonthOctober,
  GregorianMonthNovember,
  GregorianMonthDecember
}
Can be switched on. For example:
var month: GregorianMonth = /* ... */
switch month {
    case .january: break
    @unknown default: break
}
will cause a compiler warning because not all cases of the closed enum have been specified.
References¶
Swift Evolution Proposal SE-0192 “Handling Future Enum Cases”
<CoreFoundation/CFAvailability.h>
<Foundation/NSObjCRuntime.h>
Clang documentation for __attribute__(enum_extensibility)
Documentation copyright¶
Note: This page uses a modified version of the documentation found in the CoreFoundation header files, which are licensed under Apache License v2.0 with Runtime Library Exception.
Note: This page also quotes from Swift Evolution proposals, which are licensed under Apache License v2.0 with Runtime Library Exception.