<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body><div style="font-family:Arial;">-1 as written due to the impedance mismatch with importing NS_STRING_ENUM and NS_EXTENSIBLE_STRING_ENUM. Exporting to Objective-C should export a typedef and several constants, not a class. Exporting generated accessors to Objective-C is unnecessary as you have -isEqual: and -hashValue on NSString over there.<br></div>
<div style="font-family:Arial;"><br></div>
<div style="font-family:Arial;">I'm not sure how technically feasible it is to identify "a struct with a single field conforming to RawRepresentable" to make it compatible with @objc, though I'm not really a compiler person.<br></div>
<div style="font-family:Arial;"><br></div>
<div style="font-family:Arial;">Other than that, I like the idea. I don't believe any of the annotations to make Objective-C code better in Swift should be one-way.<br></div>
<div style="font-family:Arial;"><br></div>
<div id="sig40804545"><div class="signature"><span class="font" style="font-family:arial, sans-serif, sans-serif">Sincerely,</span><span class="font" style="font-family:arial, sans-serif, sans-serif"></span><br></div>
<div class="signature"><span class="font" style="font-family:arial, sans-serif, sans-serif">&nbsp; Zachary Waldowski</span><span class="font" style="font-family:arial, sans-serif, sans-serif"></span><br></div>
<div class="signature"><span class="font" style="font-family:arial, sans-serif, sans-serif">&nbsp;&nbsp;</span><a href="mailto:zach@waldowski.me"><span class="font" style="font-family:arial, sans-serif, sans-serif">zach@waldowski.me</span></a><br></div>
</div>
<div><br></div>
<div><br></div>
<div>On Sun, Feb 26, 2017, at 01:21 PM, Derrick Ho via swift-evolution wrote:<br></div>
<blockquote type="cite"><div dir="ltr"><div style="font-family:Arial;">I updated my <a href="https://github.com/wh1pch81n/swift-evolution/blob/swift-enum-objc/proposals/NNNN-Swift-enum-strings-ported-to-Objective-c.md">proposal</a> to reflect the community's desire to build on @objc instead of adding a new attribute @objcstring.<br></div>
<div><br></div>
<div>I've included it below for convenience:<br></div>
<div><br></div>
<div><h1 style="margin-top:0px;margin-right:0px;margin-bottom:16px;margin-left:0px;line-height:1.25;padding-bottom:0.3em;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:rgb(238, 238, 238);color:rgb(51, 51, 51);font-family:-apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol';">Swift Enum strings ported to Objective-c<br></h1><ul style="padding-left:2em;margin-top:0px;margin-bottom:16px;color:rgb(51, 51, 51);font-family:-apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol';font-size:16px;"><li style="">Proposal:&nbsp;<a href="https://github.com/wh1pch81n/swift-evolution/blob/swift-enum-objc/proposals/NNNN-filename.md" style="background-color:transparent;color:rgb(64, 120, 192);text-decoration:none;">SE-NNNN</a><br></li><li style="margin-top:0.25em;">Authors:&nbsp;<a href="https://github.com/wh1pch81n" style="background-color:transparent;color:rgb(64, 120, 192);text-decoration:none;">Derrick Ho</a><br></li><li style="margin-top:0.25em;">Review Manager: TBD<br></li><li style="margin-top:0.25em;">Status:&nbsp;<span style="font-weight:600;">Awaiting review</span><br></li></ul><p style="margin-top: 0px; margin-bottom: 16px;"><span class="colour" style="color:rgb(51, 51, 51)"><span class="font" style="font-family:-apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol'"><span class="size" style="font-size:16px"><i>During the review process, add the following fields as needed:</i></span></span></span><br></p><ul style="padding-left:2em;margin-top:0px;margin-bottom:16px;color:rgb(51, 51, 51);font-family:-apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol';font-size:16px;"><li style="">Decision Notes:&nbsp;<a href="https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20161114/028950.html" style="background-color:transparent;color:rgb(64, 120, 192);text-decoration:none;">Rationale</a><br></li><li style="margin-top:0.25em;">Previous Proposal:&nbsp;<a href="https://github.com/wh1pch81n/swift-evolution/blob/swift-enum-objc/proposals/0033-import-objc-constants.md" style="background-color:transparent;color:rgb(64, 120, 192);text-decoration:none;">SE-0033</a><br></li></ul><h2 style="margin-top:24px;margin-bottom:16px;line-height:1.25;padding-bottom:0.3em;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:rgb(238, 238, 238);color:rgb(51, 51, 51);font-family:-apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol';"><a href="https://github.com/wh1pch81n/swift-evolution/blob/swift-enum-objc/proposals/NNNN-Swift-enum-strings-ported-to-Objective-c.md#introduction" style="background-color:transparent;color:rgb(64, 120, 192);text-decoration:none;float:left;padding-right:4px;line-height:1;"></a>Introduction<br></h2><p style="margin-top: 0px; margin-bottom: 16px;"><span class="colour" style="color:rgb(51, 51, 51)"><span class="font" style="font-family:-apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol'"><span class="size" style="font-size:16px">We should allow swift-enum-strings and swift-struct-strings to be bridged to objective-c. We can use the following notation:</span></span></span><br></p><p style="margin-top: 0px; margin-bottom: 16px;"><span class="colour" style="color:rgb(51, 51, 51)"><span class="font" style="font-family:-apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol'"><span class="size" style="font-size:16px">@objc enum Planets: String { case Mercury }</span></span></span><br></p><p style="margin-top: 0px; margin-bottom: 16px;"><span class="colour" style="color:rgb(51, 51, 51)"><span class="font" style="font-family:-apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol'"><span class="size" style="font-size:16px">@objc struct Food: String { public static let hamburger = Food(rawValue: "hamburger") }</span></span></span><br></p><p style="margin-top: 0px; margin-bottom: 16px;"><span class="colour" style="color:rgb(51, 51, 51)"><span class="font" style="font-family:-apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol'"><span class="size" style="font-size:16px">Creating a bridgable version will allow objective-c to enjoy some of the benefits that swift enjoys.&nbsp;</span></span></span><br></p><p style="margin-top: 0px; margin-bottom: 16px;"><span class="colour" style="color:rgb(51, 51, 51)"><span class="font" style="font-family:-apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol'"><span class="size" style="font-size:16px">Swift-evolution thread:&nbsp;<a href="https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20161114/028950.html" style="background-color:transparent;color:rgb(64, 120, 192);text-decoration:none;">Discussion</a>&nbsp;<a href="https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20170220/032656.html" style="background-color:transparent;color:rgb(64, 120, 192);text-decoration:none;">Discussion</a></span></span></span><br></p><h2 style="margin-top:24px;margin-bottom:16px;line-height:1.25;padding-bottom:0.3em;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:rgb(238, 238, 238);color:rgb(51, 51, 51);font-family:-apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol';"><a href="https://github.com/wh1pch81n/swift-evolution/blob/swift-enum-objc/proposals/NNNN-Swift-enum-strings-ported-to-Objective-c.md#motivation" style="background-color:transparent;color:rgb(64, 120, 192);text-decoration:none;float:left;padding-right:4px;line-height:1;"></a>Motivation<br></h2><p style="margin-top: 0px; margin-bottom: 16px;"><span class="colour" style="color:rgb(51, 51, 51)"><span class="font" style="font-family:-apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol'"><span class="size" style="font-size:16px">NS_STRING_ENUM and NS_EXSTENSIBLE_STRING_ENUM are annotations that you can add to an objective-c global string. The annotations will make swift interpret the objective-c global strings as enum and structs respectively in theory. But it actually&nbsp;<a href="https://bugs.swift.org/browse/SR-3146" style="background-color:transparent;color:rgb(64, 120, 192);text-decoration:none;">doesn't ever create enums</a>.</span></span></span><br></p><p style="margin-top: 0px; margin-bottom: 16px;"><span class="colour" style="color:rgb(51, 51, 51)"><span class="font" style="font-family:-apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol'"><span class="size" style="font-size:16px">The problem seems to stem from the conversion from objc to swift. It might be more fruitful to make a conversion from swift to objc.</span></span></span><br></p><p style="margin-top: 0px; margin-bottom: 16px;"><span class="colour" style="color:rgb(51, 51, 51)"><span class="font" style="font-family:-apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol'"><span class="size" style="font-size:16px">However, what if we take it a step further? Turning a swift-string-enum into a bunch of global NSStrings really limits its power. There are many classes written by apple that are structs in swift but become classes in objective-c (i.e. String becomes NSString, Date becomes NSDate, Array becomes NSArray, etc). There is a special bridging mechanism that allows this to be possible. I think we should expand on that.</span></span></span><br></p><h2 style="margin-top:24px;margin-bottom:16px;line-height:1.25;padding-bottom:0.3em;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:rgb(238, 238, 238);color:rgb(51, 51, 51);font-family:-apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol';"><a href="https://github.com/wh1pch81n/swift-evolution/blob/swift-enum-objc/proposals/NNNN-Swift-enum-strings-ported-to-Objective-c.md#proposed-solution" style="background-color:transparent;color:rgb(64, 120, 192);text-decoration:none;float:left;padding-right:4px;line-height:1;"></a>Proposed solution<br></h2><pre style="font-family:sfmono-regular, consolas, 'liberation mono', menlo, courier, monospace;font-size:13.600000381469727px;margin-top:0px;margin-bottom:16px;line-height:1.45;word-wrap:normal;padding-top:16px;padding-right:16px;padding-bottom:16px;padding-left:16px;overflow-x:auto;overflow-y:auto;background-color:rgb(247, 247, 247);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;color:rgb(51, 51, 51);"><code style="font-family:sfmono-regular, consolas, 'liberation mono', menlo, courier, monospace;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;background-color:transparent;border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;word-break:normal;border-top-width:0px;border-right-width:0px;border-bottom-width:0px;border-left-width:0px;border-top-style:initial;border-right-style:initial;border-bottom-style:initial;border-left-style:initial;border-top-color:initial;border-right-color:initial;border-bottom-color:initial;border-left-color:initial;border-image-source:initial;border-image-slice:initial;border-image-width:initial;border-image-outset:initial;border-image-repeat:initial;display:inline;overflow-x:visible;overflow-y:visible;line-height:inherit;word-wrap:normal;">// `@objc` and `String` can be applied to an enum to make it available to objective-c:
//
@objc
public enum Food: String {
   case Calamari 
   case Fish


// This can be ported over to Objective-c as an objective-c class

@interface Food: NSObject

@property (readonly) NSString *_Nonnull rawValue;

- (instancetype _Nullable)initWithRawValue:(NSString *_Nonnull)rawValue;

+ (instanceType _Nonnull)Calamari;
+ (instanceType _Nonnull)Fish;

@end

</code><br></pre><pre style="font-family:sfmono-regular, consolas, 'liberation mono', menlo, courier, monospace;font-size:13.600000381469727px;margin-top:0px;margin-bottom:16px;line-height:1.45;word-wrap:normal;padding-top:16px;padding-right:16px;padding-bottom:16px;padding-left:16px;overflow-x:auto;overflow-y:auto;background-color:rgb(247, 247, 247);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;color:rgb(51, 51, 51);"><code style="font-family:sfmono-regular, consolas, 'liberation mono', menlo, courier, monospace;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;background-color:transparent;border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;word-break:normal;border-top-width:0px;border-right-width:0px;border-bottom-width:0px;border-left-width:0px;border-top-style:initial;border-right-style:initial;border-bottom-style:initial;border-left-style:initial;border-top-color:initial;border-right-color:initial;border-bottom-color:initial;border-left-color:initial;border-image-source:initial;border-image-slice:initial;border-image-width:initial;border-image-outset:initial;border-image-repeat:initial;display:inline;overflow-x:visible;overflow-y:visible;line-height:inherit;word-wrap:normal;">// `@objc` and `String` can be applied to a struct to make it available to objective-c:
//

@objc
public struct Planets: String {
  public let rawValue: String //&lt;- This should be implicit and the user should not need to add it
  init(rawValue: String) { self.rawValue = rawValue } //&lt;- This should be implicit and the user should not need to add it

  public static let Earth = Planets(rawValue: "Earth") //&lt;- user defines these
  public static let Venus = Planets(rawValue: "Venus") //&lt;- user defines these
}

// This can be ported over to objective-c as a class

@interface Planets: NSObject 
- (instancetype _Nonnull)initWithRawValue:(NSString *_Nonnull)rawValue;

+ (instancetype)Earth;
+ (instancetype)Venus;
@end
</code><br></pre><p style="margin-top: 0px; margin-bottom: 16px;"><span class="colour" style="color:rgb(51, 51, 51)"><span class="font" style="font-family:-apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol'"><span class="size" style="font-size:16px">The difference between a swift-enum-string and a swift-struct-string is that swift-enum-string provides a failable initializer while swift-struct-string provides a non-failable initializer.</span></span></span><br></p><h2 style="margin-top:24px;margin-bottom:16px;line-height:1.25;padding-bottom:0.3em;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:rgb(238, 238, 238);color:rgb(51, 51, 51);font-family:-apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol';"><a href="https://github.com/wh1pch81n/swift-evolution/blob/swift-enum-objc/proposals/NNNN-Swift-enum-strings-ported-to-Objective-c.md#detailed-design" style="background-color:transparent;color:rgb(64, 120, 192);text-decoration:none;float:left;padding-right:4px;line-height:1;"></a>Detailed design<br></h2><h3 style="margin-top:24px;margin-bottom:16px;font-size:1.25em;line-height:1.25;color:rgb(51, 51, 51);font-family:-apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol';"><a href="https://github.com/wh1pch81n/swift-evolution/blob/swift-enum-objc/proposals/NNNN-Swift-enum-strings-ported-to-Objective-c.md#swift-string-enum---casestring-translations" style="background-color:transparent;color:rgb(64, 120, 192);text-decoration:none;float:left;padding-right:4px;line-height:1;"></a>swift-string-enum - case/string translations<br></h3><p style="margin-top: 0px; margin-bottom: 16px;"><span class="colour" style="color:rgb(51, 51, 51)"><span class="font" style="font-family:-apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol'"><span class="size" style="font-size:16px">A swift-enum-string, is created with cases and it has an implicit string value based on the name of the case. The user may also add a name that does not equal the name of the case.</span></span></span><br></p><pre style="font-family:sfmono-regular, consolas, 'liberation mono', menlo, courier, monospace;font-size:13.600000381469727px;margin-top:0px;margin-bottom:16px;line-height:1.45;word-wrap:normal;padding-top:16px;padding-right:16px;padding-bottom:16px;padding-left:16px;overflow-x:auto;overflow-y:auto;background-color:rgb(247, 247, 247);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;color:rgb(51, 51, 51);"><code style="font-family:sfmono-regular, consolas, 'liberation mono', menlo, courier, monospace;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;background-color:transparent;border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;word-break:normal;border-top-width:0px;border-right-width:0px;border-bottom-width:0px;border-left-width:0px;border-top-style:initial;border-right-style:initial;border-bottom-style:initial;border-left-style:initial;border-top-color:initial;border-right-color:initial;border-bottom-color:initial;border-left-color:initial;border-image-source:initial;border-image-slice:initial;border-image-width:initial;border-image-outset:initial;border-image-repeat:initial;display:inline;overflow-x:visible;overflow-y:visible;line-height:inherit;word-wrap:normal;">// Swift
@objc
public enum Food: String {
  case Calamari 
  case Fish = "Flounder" //&lt;-- User wants Fish to be Flounder


// Objective-c

@interface Food: NSObject

@property (readonly) NSString *_Nonnull rawValue;

+ (instanceType _Nonnull)Calamari;
+ (instanceType _Nonnull)Fish;

@end

@implementation Food
+ (instanceType _Nonnull)Calamari { return [[Food alloc] initWithRawValue:@"Calimari"]; }
+ (instanceType _Nonnull)Fish { return [[Food alloc] initWithRawValue:@"Flounder"]; } //&lt;-- Fisher contains Flounder
@end
</code><br></pre><h3 style="margin-top:24px;margin-bottom:16px;font-size:1.25em;line-height:1.25;color:rgb(51, 51, 51);font-family:-apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol';"><a href="https://github.com/wh1pch81n/swift-evolution/blob/swift-enum-objc/proposals/NNNN-Swift-enum-strings-ported-to-Objective-c.md#swift-string-enum---failable-initializer" style="background-color:transparent;color:rgb(64, 120, 192);text-decoration:none;float:left;padding-right:4px;line-height:1;"></a>swift-string-enum - failable initializer<br></h3><p style="margin-top: 0px; margin-bottom: 16px;"><span class="colour" style="color:rgb(51, 51, 51)"><span class="font" style="font-family:-apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol'"><span class="size" style="font-size:16px">A swift-enum-string has the ability to be initialized with a string. If the string matches one of the possible cases, then it returns it, otherwise it will return nil. This feature might be implemented as a dictionary or some other means that gets the same results; Below is my suggestion.</span></span></span><br></p><pre style="font-family:sfmono-regular, consolas, 'liberation mono', menlo, courier, monospace;font-size:13.600000381469727px;margin-top:0px;margin-bottom:16px;line-height:1.45;word-wrap:normal;padding-top:16px;padding-right:16px;padding-bottom:16px;padding-left:16px;overflow-x:auto;overflow-y:auto;background-color:rgb(247, 247, 247);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;color:rgb(51, 51, 51);"><code style="font-family:sfmono-regular, consolas, 'liberation mono', menlo, courier, monospace;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;background-color:transparent;border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;word-break:normal;border-top-width:0px;border-right-width:0px;border-bottom-width:0px;border-left-width:0px;border-top-style:initial;border-right-style:initial;border-bottom-style:initial;border-left-style:initial;border-top-color:initial;border-right-color:initial;border-bottom-color:initial;border-left-color:initial;border-image-source:initial;border-image-slice:initial;border-image-width:initial;border-image-outset:initial;border-image-repeat:initial;display:inline;overflow-x:visible;overflow-y:visible;line-height:inherit;word-wrap:normal;">// Assuming this swift implementation
@objc
public enum Food: String {
  case Calamari 
  case Fish = "Flounder" //&lt;-- User wants Fish to be Flounder


// The objective-c failable initializer may look like this.
@implementation Food

- (instancetype _Nullable)initWithRawValue:(NSString *_Nonnull)rawValue {
  static NSDictionary &lt;NSString *, NSString *&gt;*states;
  if (!states) {
    // A dictionary where the KEYs are the acceptable rawValue's and the VALUE are empty strings
    states = @{
      @"Calimari" : @"",
      @"Flounder" : @""
    }
  }

  if ((self = [super init])) {
    if (states[rawValue]) {
      _rawValue = rawValue
      return self;
    }
  }
  return nil;
}

@end
</code><br></pre><h3 style="margin-top:24px;margin-bottom:16px;font-size:1.25em;line-height:1.25;color:rgb(51, 51, 51);font-family:-apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol';"><a href="https://github.com/wh1pch81n/swift-evolution/blob/swift-enum-objc/proposals/NNNN-Swift-enum-strings-ported-to-Objective-c.md#swift-string-enum---methods" style="background-color:transparent;color:rgb(64, 120, 192);text-decoration:none;float:left;padding-right:4px;line-height:1;"></a>swift-string-enum - methods<br></h3><p style="margin-top: 0px; margin-bottom: 16px;"><span class="colour" style="color:rgb(51, 51, 51)"><span class="font" style="font-family:-apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol'"><span class="size" style="font-size:16px">swift enums allow methods to be defined. If you mark a method with&nbsp;<code style="font-family:sfmono-regular, consolas, 'liberation mono', menlo, courier, monospace;font-size:13.600000381469727px;padding-top:0.2em;padding-right:0px;padding-bottom:0.2em;padding-left:0px;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;background-color:rgba(0, 0, 0, 0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;">@objc</code>&nbsp;it should be made available to objective-c.&nbsp;</span></span></span><br></p><pre style="font-family:sfmono-regular, consolas, 'liberation mono', menlo, courier, monospace;font-size:13.600000381469727px;margin-top:0px;margin-bottom:16px;line-height:1.45;word-wrap:normal;padding-top:16px;padding-right:16px;padding-bottom:16px;padding-left:16px;overflow-x:auto;overflow-y:auto;background-color:rgb(247, 247, 247);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;color:rgb(51, 51, 51);"><code style="font-family:sfmono-regular, consolas, 'liberation mono', menlo, courier, monospace;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;background-color:transparent;border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;word-break:normal;border-top-width:0px;border-right-width:0px;border-bottom-width:0px;border-left-width:0px;border-top-style:initial;border-right-style:initial;border-bottom-style:initial;border-left-style:initial;border-top-color:initial;border-right-color:initial;border-bottom-color:initial;border-left-color:initial;border-image-source:initial;border-image-slice:initial;border-image-width:initial;border-image-outset:initial;border-image-repeat:initial;display:inline;overflow-x:visible;overflow-y:visible;line-height:inherit;word-wrap:normal;">// Swift
@objc
public enum Food: String {
  case Calamari 
  case Fish

  @objc func price() -&gt; Double {
    // ...
  }


// Objective-c
@interface Food: NSObject 
// ...

- (Double)price;

// ...
@end
</code><br></pre><h3 style="margin-top:24px;margin-bottom:16px;font-size:1.25em;line-height:1.25;color:rgb(51, 51, 51);font-family:-apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol';"><a href="https://github.com/wh1pch81n/swift-evolution/blob/swift-enum-objc/proposals/NNNN-Swift-enum-strings-ported-to-Objective-c.md#swift-struct-string---string-translations" style="background-color:transparent;color:rgb(64, 120, 192);text-decoration:none;float:left;padding-right:4px;line-height:1;"></a>swift-struct-string - string translations<br></h3><p style="margin-top: 0px; margin-bottom: 16px;"><span class="colour" style="color:rgb(51, 51, 51)"><span class="font" style="font-family:-apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol'"><span class="size" style="font-size:16px">A swift-struct-string needs to be marked with&nbsp;<code style="font-family:sfmono-regular, consolas, 'liberation mono', menlo, courier, monospace;font-size:13.600000381469727px;padding-top:0.2em;padding-right:0px;padding-bottom:0.2em;padding-left:0px;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;background-color:rgba(0, 0, 0, 0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;">@objc</code>&nbsp;and inherit from&nbsp;<code style="font-family:sfmono-regular, consolas, 'liberation mono', menlo, courier, monospace;font-size:13.600000381469727px;padding-top:0.2em;padding-right:0px;padding-bottom:0.2em;padding-left:0px;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;background-color:rgba(0, 0, 0, 0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;">String</code>&nbsp;to bridge to objective-c. A property or method must be marked with @objc to be made available to objective-c.</span></span></span><br></p><pre style="font-family:sfmono-regular, consolas, 'liberation mono', menlo, courier, monospace;font-size:13.600000381469727px;margin-top:0px;margin-bottom:16px;line-height:1.45;word-wrap:normal;padding-top:16px;padding-right:16px;padding-bottom:16px;padding-left:16px;overflow-x:auto;overflow-y:auto;background-color:rgb(247, 247, 247);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;color:rgb(51, 51, 51);"><code style="font-family:sfmono-regular, consolas, 'liberation mono', menlo, courier, monospace;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;background-color:transparent;border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;word-break:normal;border-top-width:0px;border-right-width:0px;border-bottom-width:0px;border-left-width:0px;border-top-style:initial;border-right-style:initial;border-bottom-style:initial;border-left-style:initial;border-top-color:initial;border-right-color:initial;border-bottom-color:initial;border-left-color:initial;border-image-source:initial;border-image-slice:initial;border-image-width:initial;border-image-outset:initial;border-image-repeat:initial;display:inline;overflow-x:visible;overflow-y:visible;line-height:inherit;word-wrap:normal;">// Swift
@objc
struct Planet {
  @objc public static let Earth = Planet(rawValue: "Earth")

  @objc public func distanceFromSun() -&gt; Double { ... }
}

// Objective-c
@interface Planet
+ (instancetype _Nonnull)Earth;
+ (Double)distanceFromSun;
@end
</code><br></pre><h3 style="margin-top:24px;margin-bottom:16px;font-size:1.25em;line-height:1.25;color:rgb(51, 51, 51);font-family:-apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol';"><a href="https://github.com/wh1pch81n/swift-evolution/blob/swift-enum-objc/proposals/NNNN-Swift-enum-strings-ported-to-Objective-c.md#swift-struct-string---non-failable-initializer" style="background-color:transparent;color:rgb(64, 120, 192);text-decoration:none;float:left;padding-right:4px;line-height:1;"></a>swift-struct-string - non-failable initializer<br></h3><p style="margin-top: 0px; margin-bottom: 16px;"><span class="colour" style="color:rgb(51, 51, 51)"><span class="font" style="font-family:-apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol'"><span class="size" style="font-size:16px">The swift-struct-string initializer should not be failable and will accept any string value</span></span></span><br></p><pre style="font-family:sfmono-regular, consolas, 'liberation mono', menlo, courier, monospace;font-size:13.600000381469727px;margin-top:0px;margin-bottom:16px;line-height:1.45;word-wrap:normal;padding-top:16px;padding-right:16px;padding-bottom:16px;padding-left:16px;overflow-x:auto;overflow-y:auto;background-color:rgb(247, 247, 247);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;color:rgb(51, 51, 51);"><code style="font-family:sfmono-regular, consolas, 'liberation mono', menlo, courier, monospace;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;background-color:transparent;border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;word-break:normal;border-top-width:0px;border-right-width:0px;border-bottom-width:0px;border-left-width:0px;border-top-style:initial;border-right-style:initial;border-bottom-style:initial;border-left-style:initial;border-top-color:initial;border-right-color:initial;border-bottom-color:initial;border-left-color:initial;border-image-source:initial;border-image-slice:initial;border-image-width:initial;border-image-outset:initial;border-image-repeat:initial;display:inline;overflow-x:visible;overflow-y:visible;line-height:inherit;word-wrap:normal;">@implementation Planet
- (instancetype _Nonnull)initWithRawValue:(NSString *)rawValue {
  if ((self = [super init])) {
    _rawValue = rawValue;
  }

  return self;
}
@end
</code><br></pre><h3 style="margin-top:24px;margin-bottom:16px;font-size:1.25em;line-height:1.25;color:rgb(51, 51, 51);font-family:-apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol';"><a href="https://github.com/wh1pch81n/swift-evolution/blob/swift-enum-objc/proposals/NNNN-Swift-enum-strings-ported-to-Objective-c.md#swift-struct-string---extension" style="background-color:transparent;color:rgb(64, 120, 192);text-decoration:none;float:left;padding-right:4px;line-height:1;"></a>swift-struct-string - extension<br></h3><p style="margin-top: 0px; margin-bottom: 16px;"><span class="colour" style="color:rgb(51, 51, 51)"><span class="font" style="font-family:-apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol'"><span class="size" style="font-size:16px">One of the key attributes of an extensible string enum is that it can be extended. This should produce something available to objective-c. The original definition of Planet needs to have been marked with @objc.</span></span></span><br></p><pre style="font-family:sfmono-regular, consolas, 'liberation mono', menlo, courier, monospace;font-size:13.600000381469727px;margin-top:0px;margin-bottom:16px;line-height:1.45;word-wrap:normal;padding-top:16px;padding-right:16px;padding-bottom:16px;padding-left:16px;overflow-x:auto;overflow-y:auto;background-color:rgb(247, 247, 247);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;color:rgb(51, 51, 51);"><code style="font-family:sfmono-regular, consolas, 'liberation mono', menlo, courier, monospace;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;background-color:transparent;border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;word-break:normal;border-top-width:0px;border-right-width:0px;border-bottom-width:0px;border-left-width:0px;border-top-style:initial;border-right-style:initial;border-bottom-style:initial;border-left-style:initial;border-top-color:initial;border-right-color:initial;border-bottom-color:initial;border-left-color:initial;border-image-source:initial;border-image-slice:initial;border-image-width:initial;border-image-outset:initial;border-image-repeat:initial;display:inline;overflow-x:visible;overflow-y:visible;line-height:inherit;word-wrap:normal;">// Swift
extension Planet {
  @objc public static let Pluto = Planet(rawValue: "Pluto")
}

// Objective-c

@interface Planet (extention_1)
- (instancetype _Nonnull)Pluto;
@end

@implementation Planet (extention_1)
- (instancetype _Nonnull)Pluto {
  return [[Planet alloc] initWithRawValue:@"Pluto"];
}
@end
</code><br></pre><h3 style="margin-top:24px;margin-bottom:16px;font-size:1.25em;line-height:1.25;color:rgb(51, 51, 51);font-family:-apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol';"><a href="https://github.com/wh1pch81n/swift-evolution/blob/swift-enum-objc/proposals/NNNN-Swift-enum-strings-ported-to-Objective-c.md#swift-string-enum--swift-struct-string---equalityhashrawvalue" style="background-color:transparent;color:rgb(64, 120, 192);text-decoration:none;float:left;padding-right:4px;line-height:1;"></a>swift-string-enum &amp;&amp; swift-struct-string - equality/hash/rawValue<br></h3><p style="margin-top: 0px; margin-bottom: 16px;"><span class="colour" style="color:rgb(51, 51, 51)"><span class="font" style="font-family:-apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol'"><span class="size" style="font-size:16px">When an enum or struct is marked with&nbsp;<code style="font-family:sfmono-regular, consolas, 'liberation mono', menlo, courier, monospace;font-size:13.600000381469727px;padding-top:0.2em;padding-right:0px;padding-bottom:0.2em;padding-left:0px;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;background-color:rgba(0, 0, 0, 0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;">@objc</code>&nbsp;and&nbsp;<code style="font-family:sfmono-regular, consolas, 'liberation mono', menlo, courier, monospace;font-size:13.600000381469727px;padding-top:0.2em;padding-right:0px;padding-bottom:0.2em;padding-left:0px;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;background-color:rgba(0, 0, 0, 0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;">String</code>, the objective-c class that is produced should have its equality/hash methods and rawValue property implicitly be implemented. The user should not need to implement these on his/her own.&nbsp;</span></span></span><br></p><pre style="font-family:sfmono-regular, consolas, 'liberation mono', menlo, courier, monospace;font-size:13.600000381469727px;margin-top:0px;margin-bottom:16px;line-height:1.45;word-wrap:normal;padding-top:16px;padding-right:16px;padding-bottom:16px;padding-left:16px;overflow-x:auto;overflow-y:auto;background-color:rgb(247, 247, 247);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;color:rgb(51, 51, 51);"><code style="font-family:sfmono-regular, consolas, 'liberation mono', menlo, courier, monospace;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;background-color:transparent;border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;word-break:normal;border-top-width:0px;border-right-width:0px;border-bottom-width:0px;border-left-width:0px;border-top-style:initial;border-right-style:initial;border-bottom-style:initial;border-left-style:initial;border-top-color:initial;border-right-color:initial;border-bottom-color:initial;border-left-color:initial;border-image-source:initial;border-image-slice:initial;border-image-width:initial;border-image-outset:initial;border-image-repeat:initial;display:inline;overflow-x:visible;overflow-y:visible;line-height:inherit;word-wrap:normal;">@implementation Food

- (instancetype)rawValue { return _rawValue; }

- (NSUInteger)hash {
  return [[self rawValue] hash];
}

- (BOOL)isEqual:(id)object {
  if (self == object) { return YES }
  if (![object isKindOfClass:[Food class]]) { return NO; }

  return [self.rawValue isEqualToString:((Food *)object).rawValue];
}

@end
</code><br></pre><h2 style="margin-top:24px;margin-bottom:16px;line-height:1.25;padding-bottom:0.3em;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:rgb(238, 238, 238);color:rgb(51, 51, 51);font-family:-apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol';"><a href="https://github.com/wh1pch81n/swift-evolution/blob/swift-enum-objc/proposals/NNNN-Swift-enum-strings-ported-to-Objective-c.md#objective-c-name" style="background-color:transparent;color:rgb(64, 120, 192);text-decoration:none;float:left;padding-right:4px;line-height:1;"></a>Objective-c name<br></h2><p style="margin-top: 0px; margin-bottom: 16px;"><span class="colour" style="color:rgb(51, 51, 51)"><span class="font" style="font-family:-apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol'"><span class="size" style="font-size:16px">In the above examples, the objective-c name of the class and the swift name of the class were the same. If this causes a naming conflict then the objective-c name could be Prefixed with ENUM.</span></span></span><br></p><pre style="font-family:sfmono-regular, consolas, 'liberation mono', menlo, courier, monospace;font-size:13.600000381469727px;margin-top:0px;margin-bottom:16px;line-height:1.45;word-wrap:normal;padding-top:16px;padding-right:16px;padding-bottom:16px;padding-left:16px;overflow-x:auto;overflow-y:auto;background-color:rgb(247, 247, 247);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;color:rgb(51, 51, 51);"><code style="font-family:sfmono-regular, consolas, 'liberation mono', menlo, courier, monospace;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;background-color:transparent;border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;word-break:normal;border-top-width:0px;border-right-width:0px;border-bottom-width:0px;border-left-width:0px;border-top-style:initial;border-right-style:initial;border-bottom-style:initial;border-left-style:initial;border-top-color:initial;border-right-color:initial;border-bottom-color:initial;border-left-color:initial;border-image-source:initial;border-image-slice:initial;border-image-width:initial;border-image-outset:initial;border-image-repeat:initial;display:inline;overflow-x:visible;overflow-y:visible;line-height:inherit;word-wrap:normal;">// Swift
@objc
enum Planet: String { ... }

// Objective-c
@interface ENUMPlanet
@end
</code><br></pre><p style="margin-top: 0px; margin-bottom: 16px;"><span class="colour" style="color:rgb(51, 51, 51)"><span class="font" style="font-family:-apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol'"><span class="size" style="font-size:16px">The programmer should still be able to add their own name by specifying it as an argument.</span></span></span><br></p><pre style="font-family:sfmono-regular, consolas, 'liberation mono', menlo, courier, monospace;font-size:13.600000381469727px;margin-top:0px;margin-bottom:16px;line-height:1.45;word-wrap:normal;padding-top:16px;padding-right:16px;padding-bottom:16px;padding-left:16px;overflow-x:auto;overflow-y:auto;background-color:rgb(247, 247, 247);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;color:rgb(51, 51, 51);"><code style="font-family:sfmono-regular, consolas, 'liberation mono', menlo, courier, monospace;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;background-color:transparent;border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;word-break:normal;border-top-width:0px;border-right-width:0px;border-bottom-width:0px;border-left-width:0px;border-top-style:initial;border-right-style:initial;border-bottom-style:initial;border-left-style:initial;border-top-color:initial;border-right-color:initial;border-bottom-color:initial;border-left-color:initial;border-image-source:initial;border-image-slice:initial;border-image-width:initial;border-image-outset:initial;border-image-repeat:initial;display:inline;overflow-x:visible;overflow-y:visible;line-height:inherit;word-wrap:normal;">// Swift
@objc(CustomPlanet)
enum Planet { ... }

// Objective-c
@interface CustomPlanet
@end
</code><br></pre><h2 style="margin-top:24px;margin-bottom:16px;line-height:1.25;padding-bottom:0.3em;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:rgb(238, 238, 238);color:rgb(51, 51, 51);font-family:-apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol';"><a href="https://github.com/wh1pch81n/swift-evolution/blob/swift-enum-objc/proposals/NNNN-Swift-enum-strings-ported-to-Objective-c.md#source-compatibility" style="background-color:transparent;color:rgb(64, 120, 192);text-decoration:none;float:left;padding-right:4px;line-height:1;"></a>Source compatibility<br></h2><p style="margin-top: 0px; margin-bottom: 16px;"><span class="colour" style="color:rgb(51, 51, 51)"><span class="font" style="font-family:-apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol'"><span class="size" style="font-size:16px">This will be an additive feature and will not break anything existing.</span></span></span><br></p><h2 style="margin-top:24px;margin-bottom:16px;line-height:1.25;padding-bottom:0.3em;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:rgb(238, 238, 238);color:rgb(51, 51, 51);font-family:-apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol';"><a href="https://github.com/wh1pch81n/swift-evolution/blob/swift-enum-objc/proposals/NNNN-Swift-enum-strings-ported-to-Objective-c.md#alternatives-considered" style="background-color:transparent;color:rgb(64, 120, 192);text-decoration:none;float:left;padding-right:4px;line-height:1;"></a>Alternatives considered<br></h2><ul style="padding-left:2em;margin-top:0px;color:rgb(51, 51, 51);font-family:-apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol';font-size:16px;margin-bottom:0px;"><li style=""><p style="margin-top:16px;margin-bottom:16px;">Implement a swift class that implements the above described behviors.<br></p></li><li style="margin-top:0.25em;"><p style="margin-top:16px;margin-bottom:16px;">Don't change anything.<br></p></li></ul></div>
</div>
<div style="font-family:Arial;"><br></div>
<div defang_data-gmailquote="yes"><div dir="ltr">On Tue, Feb 21, 2017 at 6:09 PM Derrick Ho &lt;<a href="mailto:wh1pch81n@gmail.com">wh1pch81n@gmail.com</a>&gt; wrote:<br></div>
<blockquote defang_data-gmailquote="yes" style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204, 204, 204);padding-left:1ex;"><div style="font-family:Arial;">True. <br></div>
<div style="font-family:Arial;">In my proposal I mention how NS_STRING_ENUM  doesn't produce an swift enum.<br></div>
<div style="font-family:Arial;"><br></div>
<div style="font-family:Arial;">So one solution is to merely "go the other way" which would produce what Kevin N. suggested. <br></div>
<div style="font-family:Arial;"><br></div>
<div style="font-family:Arial;">Is it not odd that that the objc version is so different from the swift version?<br></div>
<div style="font-family:Arial;"><br></div>
<div style="font-family:Arial;">Would it not be better to offer a somewhat similar API experience between the two languages?<br></div>
<div style="font-family:Arial;"><br></div>
<div style="font-family:Arial;">@objcstring would "promote" the swift enum to an objective-c class to make the API experience similar.<br></div>
<div style="font-family:Arial;"><br></div>
<div style="font-family:Arial;">I understand that maybe @objcstring is too niche to get its own annotation.  Instead @objc should become more powerful.<br></div>
<div style="font-family:Arial;"><br></div>
<div style="font-family:Arial;">I think @objc should make an enum become a class with swift-enum like abilities.  This would allow enum functions to be bridged over to objective-c as well.<br></div>
<div><div dir="ltr">On Tue, Feb 21, 2017 at 1:32 PM Michael Ilseman &lt;<a href="mailto:milseman@apple.com">milseman@apple.com</a>&gt; wrote:<br></div>
<blockquote style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204, 204, 204);padding-left:1ex;"><div style="word-wrap:break-word;"><div>A quick note addressing a misconception that you’ll want to clean up for a formal proposal:<br></div>
<div><br></div>
<div>NS_[EXTENSIBLE_]STRING_ENUMs both generate Swift structs, the difference is only in the explicitness of the rawValue initializer. To use the “other direction” analogy, you’d similarly want them to apply for rawValue-ed structs alone. The reasons are the same: only the structs are layout-compatible because enums are integers.<br></div>
<div><br></div>
<div>Once you go down this route, perhaps it doesn’t make sense to annotate the struct decls themselves anymore. Maybe you just want more @objc control over bridging the types. For example, maybe you want to introduce a feature so that static members that are layout-compatible with String are bridged as global strings with the supplied name.<br></div>
<div><br></div>
<div><br></div>
<div><br></div>
<div><blockquote type="cite"><br></blockquote></div>
</div>
<div style="word-wrap:break-word;"><div><blockquote type="cite"><div>On Feb 20, 2017, at 4:07 PM, Derrick Ho via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br></div>
</blockquote></div>
</div>
<div style="word-wrap:break-word;"><div><blockquote type="cite"><div><div><div style="color:rgb(49, 49, 49);word-spacing:1px;">Swift should not forsake objective-c.&nbsp; At least not when it comes enum strings.&nbsp; Although swift enums are suppose to be swift only, I think we should add a new attribute to slightly relax that.&nbsp; I think a good attribute would be @objcstring.<br></div>
<div style="color:rgb(49, 49, 49);word-spacing:1px;"><br></div>
<div style="color:rgb(49, 49, 49);word-spacing:1px;">By adding @objcstring, an objective-c exclusive class will be generated.<br></div>
<div style="color:rgb(49, 49, 49);word-spacing:1px;"><br></div>
<div style="color:rgb(49, 49, 49);word-spacing:1px;">@objcstring<br></div>
<div style="color:rgb(49, 49, 49);word-spacing:1px;">enum Planet {<br></div>
<div style="color:rgb(49, 49, 49);word-spacing:1px;">&nbsp; case Jupiter<br></div>
<div style="color:rgb(49, 49, 49);word-spacing:1px;">}<br></div>
<div style="color:rgb(49, 49, 49);word-spacing:1px;"><br></div>
<div style="color:rgb(49, 49, 49);word-spacing:1px;">I have written up a proposal with more details on what it would look for objective-c.<br></div>
<div style="color:rgb(49, 49, 49);word-spacing:1px;"><br></div>
<div style="font-family:Arial;"><a href="https://github.com/wh1pch81n/swift-evolution/blob/swift-enum-objc/proposals/NNNN-Swift-enum-strings-ported-to-Objective-c.md" style="word-spacing:1px;">https://github.com/wh1pch81n/swift-evolution/blob/swift-enum-objc/proposals/NNNN-Swift-enum-strings-ported-to-Objective-c.md</a><br></div>
<div style="color:rgb(49, 49, 49);word-spacing:1px;"><br></div>
<div style="color:rgb(49, 49, 49);word-spacing:1px;">If no one objects to this proposal I'll submit it.<br></div>
<div style="color:rgb(49, 49, 49);word-spacing:1px;"><br></div>
<div style="color:rgb(49, 49, 49);word-spacing:1px;">**notes: I am reviving this discussion so that I may submit this for Swift 4 stage 2<br></div>
</div>
</div>
</blockquote></div>
</div>
<div style="word-wrap:break-word;"><div><blockquote type="cite"><div><div style="font-family:Arial;">_______________________________________________<br></div>
<div style="font-family:Arial;">swift-evolution mailing list<br></div>
<div style="font-family:Arial;"><a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br></div>
<div style="font-family:Arial;"><a href="https://lists.swift.org/mailman/listinfo/swift-evolution">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br></div>
</div>
</blockquote></div>
</div>
</blockquote></div>
</blockquote></div>
<div><u>_______________________________________________</u><br></div>
<div>swift-evolution mailing list<br></div>
<div><a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br></div>
<div><a href="https://lists.swift.org/mailman/listinfo/swift-evolution">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br></div>
</blockquote><div style="font-family:Arial;"><br></div>
</body>
</html>