<div dir="ltr"><div>Interesting suggestion :)</div><div>Perhaps, try doing the work outside the constructor, then the static function suggestions work:<br></div><div><br></div><div><font face="monospace, monospace">struct Key {</font></div><div><font face="monospace, monospace">    public static func createRSA() {</font></div><div><font face="monospace, monospace">        var data: String</font></div><div><font face="monospace, monospace">        // calculate RSA</font></div><div><font face="monospace, monospace">        ...<br></font></div><div><font face="monospace, monospace">        return Key(bitLength: 2048, data: data)</font></div><div><font face="monospace, monospace">    }</font></div><div><font face="monospace, monospace">    private init(bitLength: Int, data: String) {</font></div><div><font face="monospace, monospace">        self.bitLength = bitLength</font></div><div><font face="monospace, monospace">        self.data = data</font></div><div><font face="monospace, monospace">    }</font></div><div><font face="monospace, monospace">}</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">var myKey = Key.createRSA()</font></div><div><br></div><div>In my opinion this is much less ambiguous to the compiler and programmer. I personally wouldn&#39;t be sure which of these <span style="font-family:monospace,monospace">&#39;</span><font face="monospace, monospace">Key(withRSA)&#39; </font>was:</div><div><br></div><div><font face="monospace, monospace">let withRSA: Int</font></div><div><font face="monospace, monospace">init(_ something: Int)</font></div><div><br></div><div>Or:</div><div><br></div><div><font face="monospace, monospace">init(</font><span style="font-family:monospace,monospace">withRSA</span><font face="monospace, monospace"> _ _)</font></div><div><br></div><div><br></div><div><br></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Dec 14, 2015 at 6:22 PM, David Owens II via swift-evolution <span dir="ltr">&lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class=""><br>
&gt; On Dec 13, 2015, at 1:56 PM, Drew Crawford &lt;<a href="mailto:drew@sealedabstract.com">drew@sealedabstract.com</a>&gt; wrote:<br>
&gt;<br>
&gt; The problems with enums as parameters were explained in the proposal.  I don&#39;t see how these responses address any of the concerns that were initially raised.<br>
<br>
</span>Granted. I think it’s just sadly one of those things that are lost when we combine the allocation and the initialization phase. I don’t like the labels as you’ve proposed because they are yet another special thing about initialization. For example, to solve this problem with functions, we could simply change the name of them.<br>
<br>
Your problem also reminds me of the cluster cluster problem. While they are not quite the same, they share many of the same concerns. It’s not a stretch to return different types from the Key initializer so that you don’t need to waste 1024bits with a 128bit key is all that’s needed. Of course, this requires sized arrays that Swift doesn’t have yet or some other construct to get a fixed size, but I think the point is clear.<br>
<br>
Unfortunately, I think Dave’s workaround is probably the best for your specific use case.<br>
<span class=""><br>
&gt; struct Key {<br>
&gt;  enum RSA_ { case RSA }<br>
&gt;  init(_: RSA_) { ... }<br>
&gt;<br>
&gt;  enum AES_ { case AES }<br>
&gt;  init(_: AES_) { ... }<br>
&gt; }<br>
&gt;<br>
</span>&gt;  Key(.RSA)<br>
&gt;  Key(.AES)<br>
<br>
<br>
Then you have this:<br>
<span class=""><br>
&gt; Q: Can we extend this to support arbitrary labels e.g. `init(random length: 2000)` vs `init(zeroed length: 2000)`, `mkdir(path, creatingIntermediateDirectoriesIfRequired)` and many more?<br>
&gt; A: Yes, although these are probably more controversial proposals than simply supporting multiple parameterless constructors.<br>
<br>
</span>I’m not sure this really applies generally. What if I want a mkdir() that doesn’t create the directories if required? This seems to fall right into the strong house of default parameters.<br>
<br>
-David<br>
<div class="HOEnZb"><div class="h5">_______________________________________________<br>
swift-evolution mailing list<br>
<a href="mailto:swift-evolution@swift.org">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>
</div></div></blockquote></div><br></div>