<div dir="ltr"><font size="2">I feel like this might be better served by something like <font face="monospace">newtype </font>which I know I&#39;ve seen floating around on this list before. The idea is that something like:</font><div><font size="2"><br></font></div><div><font face="monospace" size="2">newtype HeaderKey = String</font></div><div><font face="monospace" size="2"><br></font></div><div><font size="2">would serve roughly as syntactic sugar for something like</font></div><div><font size="2"><br></font></div><div><font size="2" face="monospace">struct HeaderKey {</font></div><div><font size="2" face="monospace">   let value: String</font></div><div><font size="2" face="monospace">   init(_ value: String) { self.value = value }</font></div><div><font size="2" face="monospace">   /* Possibly insert methods from String here, possibly do something else, whatever */</font></div><div><font size="2" face="monospace">}</font></div><div><font size="2" face="monospace"><br></font></div><div><font size="2">I&#39;ve always thought this might be interesting, but there&#39;s a few reasons I suggest it in place of extending a <font face="monospace">typealias</font>:</font></div><div><font size="2">1) Backwards compatibility — this could very easily break existing code</font></div><div><font size="2">2) Semantically it seems to me that an <i>alias</i> is a useful distinction from <i>&quot;let&#39;s make a new type&quot; </i>— sometimes you actually just want to call one type by another name in some context </font></div><div><font size="2"><br></font></div><div><font size="2">Regardless, I think you could solve your particular problem like this:<br><br><font face="monospace">public struct HeaderKey {</font></font></div><div><div><font size="2" face="monospace">   let value: String</font></div><div><font size="2" face="monospace">   public init(_ value: String) { self.value = value }</font></div><font size="2">}</font></div><div><font size="2"><br></font></div><div><font size="2">and conform <font face="monospace">HeaderKey</font> to <font face="monospace">ExpressibleByStringLiteral</font>. That way your framework&#39;s users can still use <font face="monospace">headers[.lastModified]</font> and <font face="monospace">headers[&quot;X-MyHeader&quot;]</font> syntax, and it makes your library&#39;s code only very slightly more complicated.<br><br>Not trying to tell you how to write your library, but this approach worked really well for me recently.</font></div><div><font size="2"><br></font></div><div><font size="2">Best,<br><br>Will</font></div></div><br><div class="gmail_quote"><div dir="ltr">On Fri, Jun 9, 2017 at 12:14 AM Yvo van Beek via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Typealiases can greatly reduce the complexity of code. But I think one change in how the compiler handles them could make them even more powerful.<div><br></div><div>Let&#39;s say I&#39;m creating a web server framework and I&#39;ve created a simple dictionary to store HTTP headers (I know that headers are more complex than that, but as an example). I could write something like this:</div><div><br></div><div><div>    <font face="monospace, monospace" color="#0b5394">typealias HeaderKey = String</font></div><div><font face="monospace, monospace" color="#0b5394"><br></font></div><div><font face="monospace, monospace" color="#0b5394">  var headers = [HeaderKey: String]()</font></div><div><font face="monospace, monospace" color="#0b5394">  headers[&quot;Host&quot;] = &quot;<a href="http://domain.com" target="_blank">domain.com</a>&quot;</font></div></div><div><br></div><div>Now I can define a couple of default headers like this:</div><div><br></div><div><div><font color="#0b5394" face="monospace, monospace">  extension HeaderKey {</font></div><div><font color="#0b5394" face="monospace, monospace">    static var lastModified: String { return &quot;Last-Modified&quot; }</font></div><div><font color="#0b5394" face="monospace, monospace">    static var host: String { return &quot;Host&quot; }</font></div><div><font color="#0b5394" face="monospace, monospace">  }</font></div></div><div><br></div><div>After that I can do this:<br></div><div><br></div><div><div><span style="color:rgb(11,83,148);font-family:monospace,monospace">  </span><font color="#0b5394"><font face="monospace, monospace">var headers = [HeaderKey: String]()</font></font></div><div><span style="color:rgb(11,83,148);font-family:monospace,monospace">  </span><font face="monospace, monospace" color="#0b5394">headers[.host] = &quot;<a href="http://domain.com" target="_blank">domain.com</a>&quot;</font></div><div><span style="color:rgb(11,83,148);font-family:monospace,monospace">  </span><font face="monospace, monospace" color="#0b5394">headers[.lastModified] = &quot;some date&quot;</font><font face="monospace, monospace" color="#0b5394"><br></font></div><div><span style="color:rgb(11,83,148);font-family:monospace,monospace">  </span><font face="monospace, monospace" color="#0b5394">headers[&quot;X-MyHeader&quot;] = &quot;This still works too&quot;</font></div></div><div><font face="monospace, monospace" color="#0b5394"><br></font></div><div>But unfortunately the extension is also applied to normal strings:<font face="monospace, monospace" color="#0b5394"><br></font></div><div><br></div><div>    <font color="#0b5394" face="monospace, monospace">var normalString: String = .host</font><br></div><div><font color="#0b5394" face="monospace, monospace"><br></font></div><div>Perhaps it would be better if the extension would only apply to the parts of my code where I use the HeaderKey typealias and not to all Strings. This could be a great tool to specialize classes by creating a typealias and adding functionality to it. Another example I can think of is typealiases for dictionaries or arrays with added business logic through extensions (especially since you can&#39;t inherit from structs).<font color="#0b5394" face="monospace, monospace"><br></font></div><div><br></div><div>If you want to create an extension that adds functionality to all Strings you could have created an extension for String instead of HeaderKey.</div><div><br></div><div>Please let me know what you think. I&#39;m not sure how complex this change would be.</div><div>I could write a proposal if you&#39;re interested.</div><div><br></div><div>Kind regards,</div><div>Yvo</div></div>
_______________________________________________<br>
swift-evolution mailing list<br>
<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
</blockquote></div>