[swift-evolution] Pitch: Import Objective-C Constants as Enums

Jeff Kelley slaunchaman at gmail.com
Sun Jan 17 21:13:46 CST 2016


A lot of Cocoa APIs have long lists of constant values, typically NSStrings. I’d like to pitch a way to import them as enums with associated types. I can write up a full proposal if people think this is a good idea, but here’s my thinking:

Let’s take the error domains in NSError.h for a quick example. These entries in the header:

> FOUNDATION_EXPORT NSString *const NSCocoaErrorDomain;
> FOUNDATION_EXPORT NSString *const NSPOSIXErrorDomain;
> FOUNDATION_EXPORT NSString *const NSOSStatusErrorDomain;
> FOUNDATION_EXPORT NSString *const NSMachErrorDomain;


turn into this in the Swift interface:

> public let NSCocoaErrorDomain: String
> public let NSPOSIXErrorDomain: String
> public let NSOSStatusErrorDomain: String
> public let NSMachErrorDomain: String

What I’m proposing is a way to import those as an enum instead. Similar to how we mark sections of Objective-C code with NS_ASSUME_NONNULL_BEGIN, we could mark it with something like NS_CASE_LIST_BEGIN. Then, this code:

> NS_CASE_LIST_BEGIN;
> 
> FOUNDATION_EXPORT NSString *const NSCocoaErrorDomain;
> FOUNDATION_EXPORT NSString *const NSPOSIXErrorDomain;
> FOUNDATION_EXPORT NSString *const NSOSStatusErrorDomain;
> FOUNDATION_EXPORT NSString *const NSMachErrorDomain;
> 
> NS_CASE_LIST_END;

would be imported as follows:

> enum ErrorDomain : String {
>     case Cocoa
>     case POSIX
>     case OSStatus
>     case Mach
> }

I can think of a lot of areas in Cocoa where these APIs could make things much more type-safe in Swift. Is this a good idea? Would people use this?


Jeff Kelley

SlaunchaMan at gmail.com | @SlaunchaMan <https://twitter.com/SlaunchaMan> | jeffkelley.org <http://jeffkelley.org/>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160117/15ce8a39/attachment.html>


More information about the swift-evolution mailing list