<!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"> 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"> </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: <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: <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: <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: <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: <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. </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: <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> <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 <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 //<- This should be implicit and the user should not need to add it
init(rawValue: String) { self.rawValue = rawValue } //<- This should be implicit and the user should not need to add it
public static let Earth = Planets(rawValue: "Earth") //<- user defines these
public static let Venus = Planets(rawValue: "Venus") //<- 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" //<-- 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"]; } //<-- 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" //<-- 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 <NSString *, NSString *>*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 <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> it should 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
public enum Food: String {
case Calamari
case Fish
@objc func price() -> 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 <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> and inherit from <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> 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() -> 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 && 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 <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> and <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. </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 <<a href="mailto:wh1pch81n@gmail.com">wh1pch81n@gmail.com</a>> 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 <<a href="mailto:milseman@apple.com">milseman@apple.com</a>> 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 <<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>> 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. At least not when it comes enum strings. Although swift enums are suppose to be swift only, I think we should add a new attribute to slightly relax that. 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;"> 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>