<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">A lot of Cocoa APIs have long lists of constant values, typically <font face="Menlo" class="">NSString</font>s. I’d like to pitch a way to import them as <font face="Menlo" class="">enum</font>s with associated types. I can write up a full proposal if people think this is a good idea, but here’s my thinking:</div><div class=""><br class=""></div><div class="">Let’s take the error domains in <font face="Menlo" class="">NSError.h</font> for a quick example. These entries in the header:</div><div class=""><br class=""></div><div class=""><font face="Menlo" class=""><blockquote type="cite" class="">FOUNDATION_EXPORT NSString *const&nbsp;NSCocoaErrorDomain;<br class="">FOUNDATION_EXPORT NSString *const&nbsp;NSPOSIXErrorDomain;<br class="">FOUNDATION_EXPORT NSString *const&nbsp;NSOSStatusErrorDomain;<br class="">FOUNDATION_EXPORT NSString *const&nbsp;NSMachErrorDomain;</blockquote></font></div><div class=""><br class=""></div><div class="">turn into this in the Swift interface:</div><div class=""><br class=""></div><div class=""><font face="Menlo" class=""></font></div><blockquote type="cite" class=""><div class=""><font face="Menlo" class="">public&nbsp;let&nbsp;NSCocoaErrorDomain:&nbsp;String<br class="">public&nbsp;let&nbsp;NSPOSIXErrorDomain:&nbsp;String<br class="">public&nbsp;let&nbsp;NSOSStatusErrorDomain:&nbsp;String<br class="">public&nbsp;let&nbsp;NSMachErrorDomain:&nbsp;String</font></div></blockquote><div class=""><br class=""></div><div class="">What I’m proposing is a way to import those as an <font face="Menlo" class="">enum</font> instead. Similar to how we mark sections of Objective-C code with <font face="Menlo" class="">NS_ASSUME_NONNULL_BEGIN</font>, we could mark it with something like <font face="Menlo" class="">NS_CASE_LIST_BEGIN</font>. Then, this code:</div><div class=""><br class=""></div><div class=""></div><blockquote type="cite" class=""><div class=""><font face="Menlo" class="">NS_CASE_LIST_BEGIN;</font></div><div class=""><font face="Menlo" class=""><br class=""></font></div><div class=""><font face="Menlo" class="">FOUNDATION_EXPORT NSString *const&nbsp;NSCocoaErrorDomain;<br class="">FOUNDATION_EXPORT NSString *const&nbsp;NSPOSIXErrorDomain;<br class="">FOUNDATION_EXPORT NSString *const&nbsp;NSOSStatusErrorDomain;<br class="">FOUNDATION_EXPORT NSString *const&nbsp;NSMachErrorDomain;</font></div><div class=""><font face="Menlo" class=""><br class=""></font></div><div class=""><font face="Menlo" class="">NS_CASE_LIST_END;</font></div></blockquote><div class=""><br class=""></div><div class="">would be imported as follows:</div><div class=""><br class=""></div><font face="Menlo" class=""></font><div class=""></div><blockquote type="cite" class=""><font face="Menlo" class="">enum&nbsp;ErrorDomain :&nbsp;String&nbsp;{<br class="">&nbsp; &nbsp;&nbsp;case&nbsp;Cocoa<br class="">&nbsp; &nbsp;&nbsp;case&nbsp;POSIX<br class="">&nbsp; &nbsp;&nbsp;case&nbsp;OSStatus</font><div class=""><font face="Menlo" class="">&nbsp; &nbsp; case Mach<br class="">}</font></div></blockquote><div class=""><br class=""></div><div class="">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?<br class=""><br class=""><br class=""><div class="">
<div style="color: rgb(0, 0, 0); font-family: Helvetica;  font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; " class=""><div style="color: rgb(0, 0, 0); font-family: Helvetica;  font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; " class=""><div style="color: rgb(0, 0, 0); font-family: Helvetica;  font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; " class=""><span class="Apple-style-span" style="border-collapse: separate; line-height: normal; border-spacing: 0px;"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; " class=""><div class="">Jeff Kelley</div><div class=""><br class=""></div><div class=""><a href="mailto:SlaunchaMan@gmail.com" class="">SlaunchaMan@gmail.com</a>&nbsp;|&nbsp;<a href="https://twitter.com/SlaunchaMan" class="">@SlaunchaMan</a>&nbsp;|&nbsp;<a href="http://jeffkelley.org" class="">jeffkelley.org</a></div></div></span></div></div></div>
</div>
<br class=""></div></body></html>