<div dir="ltr"><div>Does anyone have any thoughts on this idea?</div><div><br></div><div>I Made a draft proposal of this very idea</div><a href="https://github.com/wh1pch81n/swift-evolution/blob/master/proposals/NNNN-Swift-enum-strings-ported-to-Objective-c">https://github.com/wh1pch81n/swift-evolution/blob/master/proposals/NNNN-Swift-enum-strings-ported-to-Objective-c</a><br></div><br><div class="gmail_quote"><div dir="ltr">On Sat, Nov 19, 2016 at 2:44 PM Derrick Ho &lt;<a href="mailto:wh1pch81n@gmail.com">wh1pch81n@gmail.com</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="gmail_msg"><div class="gmail_msg">[TL;DR]</div><div class="gmail_msg">SE-0033 ports objective-c global strings to swift enums, but the reverse seems to be missing. There should be a swift construct that can be accessible by objective-c.</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">[Proposal]</div>In a previously implemented swift proposal, the concept of NS_STRING_ENUM and NS_EXTENSIBLE_STRING_ENUM was born.  (see: <a href="https://github.com/apple/swift-evolution/blob/master/proposals/0033-import-objc-constants.md" class="gmail_msg" target="_blank">https://github.com/apple/swift-evolution/blob/master/proposals/0033-import-objc-constants.md</a>  )<div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">This would enable objective-c global strings to be ported over to swift as an enum and struct respectively.</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">I always found it odd that this interoperability only worked in one direction.  I think that enum strings should be accessible to Objective-c when it is marked with  the @objc attribute.  When an enum string has @objc it should be ported over to objective-c as global strings.</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">// Swift example</div><div class="gmail_msg">@objc</div><div class="gmail_msg">public enum Food: String {</div><div class="gmail_msg">   case Calamari </div><div class="gmail_msg">   case Fish</div><div class="gmail_msg">} </div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">// Objective-c port</div><div class="gmail_msg">typedef NSString *_Nonnull Food;</div><div class="gmail_msg">static Food const Food_Calimari = @&quot;Calimari&quot;;</div><div class="gmail_msg">static Food const Food_Fish = @&quot;Fish&quot;;</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">The Objective-c port code could be added as part of the generated header file or a framework&#39;s umbrella header.</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">When a structs is given the attribute @objcextstring it should become available to objective-c as a class.  This attribute will put restrictions on the struct such that it only has static constants and a mandatory property called rawValue.  </div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">// Swift example</div><div class="gmail_msg">@objcextstring</div><div class="gmail_msg">public struct Planets {</div><div class="gmail_msg">public let rawValue: String</div><div class="gmail_msg">public static let Earth = Planets(rawValue: &quot;Earth&quot;)<br class="gmail_msg"></div><div class="gmail_msg">public static let Venus = Planets(rawValue: &quot;Venus&quot;)</div><div class="gmail_msg">}</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">// Objective-c port</div><div class="gmail_msg">@interface Planets: NSObject </div><div class="gmail_msg">+ (instanceType)Earth;<br class="gmail_msg"></div><div class="gmail_msg">+ (instanceType)Venus;<br class="gmail_msg"></div><div class="gmail_msg">@end</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">@implementation Planets</div><div class="gmail_msg"><div class="gmail_msg">+ (instanceType)Earth { </div><div class="gmail_msg">return [[Planets alloc] initWithRawValue: @&quot;Earth&quot;]; </div><div class="gmail_msg">}<br class="gmail_msg"></div><div class="gmail_msg">+ (instanceType)Venus { </div><div class="gmail_msg">return [[Planets alloc] initWithRawValue:@&quot;Venus&quot;]; </div><div class="gmail_msg">}</div></div><div class="gmail_msg">@end</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">What do you guys thinks of this proposal?  Do you think it will enhance the objective-c to swift interoperability?</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg"><br class="gmail_msg"></div></div></blockquote></div>