<div dir="ltr">If the argument is that taking away &quot;init?()&quot; is going to force Swift users to embrace the One True Path of Error Handling, I don&#39;t think that&#39;s going to happen. The more likely outcome is that people are going to wrap throwable initializers in factory methods returning optionals, and throw away whatever error returns.<div><br></div><div>Not that this is a bad thing, mind you. In a lot of cases my application does not care why an operation failed, only that it did. This isn&#39;t because I&#39;m lazy, but because the recovery path for each potential type of error is exactly the same. In this case I don&#39;t care about which error was thrown, but I often do care about the ability to compose I get from nil.</div><div><br></div><div>As for the sample code, there is absolutely nothing wrong with it IMO. The contract to me for &#39;asInt&#39; reads &quot;return an Int if an item exists at `index` and, if that item exists, it can be represented as an Int&quot;. I think it&#39;s instructional to look at how Dictionary&lt;T?&gt; works - if you try to extract an element you get a double optional. This isn&#39;t a type system bug, it&#39;s completely intentional. The internal optional indicates whether an extant element was Some or None, and the external optional indicates whether or not the element existed in the dictionary to begin with. If I were writing that `asInt` function and I really needed to make the distinction between &quot;invalid index&quot; and &quot;not an integer string&quot;, I&#39;d use either that same double optional pattern, or make the function throws. If I didn&#39;t care, I&#39;d use the optional representation.</div><div><br></div><div>Best,</div><div>Austin</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Mar 8, 2016 at 1:09 PM, Haravikk 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"><div style="word-wrap:break-word"><span class=""><br><div><blockquote type="cite"><div>On 8 Mar 2016, at 15:26, Thorsten Seitz &lt;<a href="mailto:tseitz42@icloud.com" target="_blank">tseitz42@icloud.com</a>&gt; wrote:</div><div><br><blockquote type="cite">Am 08.03.2016 um 11:07 schrieb Haravikk via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt;:<br><br>Just because someone opts to use error handling over a failable initialiser doesn’t mean they have to go overboard on the detail of their errors; it’s entirely possible to pick a reasonable middle-ground.<br></blockquote><br>And it is entitely possible to just use an optional. If you prefer to use error handling over failable initializers, fine, just do so, but don&#39;t force it on others who are perfectly happy with the option to use optionals, too.</div></blockquote><br></div></span><div>It’s not an issue of ideology but of redundancy; the failable initialiser does nothing that error handling can’t do just as easily, the only difference is that instead of returning nil, you throw an appropriate error.</div><div><br></div><div>The few extra characters are hardly going to kill you, while a thrown error (with common ones available for simplicity) can describe what went wrong in more detail than just “something went wrong”. Point is that we have two ways of achieving the same goal, but error handling encourages developers to think more about what type(s) of error to throw at each point; even just simple error types with no further detail can provide more information simply by being different, for example if you have a NonNumericError vs EmptyStringError types, the errors themselves tell you all you’re likely to need to know (hopefully there’d be a good set of common types).</div><div><br></div><div>There are also some cases where failable initialisers can have subtle errors, for example, can you tell me where I might run into problems with the following:</div><div><br></div><div><span style="font-family:Menlo;font-size:11px;color:rgb(187,44,162)">struct</span><span style="font-family:Menlo;font-size:11px"> MyType {</span></div><div style="margin:0px;font-size:11px;font-family:Menlo">    <span style="color:#bb2ca2">let</span> elements:[<span style="color:#703daa">String</span>]</div><div style="margin:0px;font-size:11px;font-family:Menlo;min-height:13px"><br></div><div style="margin:0px;font-size:11px;font-family:Menlo">    <span style="color:#bb2ca2">func</span> asInt(index:<font color="#703daa">Array&lt;String&gt;.Index</font>) -&gt; <span style="color:#703daa">Int</span>? {</div><div style="margin:0px;font-size:11px;font-family:Menlo">        <span style="color:#bb2ca2">if</span> <span style="color:#bb2ca2">self</span>.<span style="color:#4f8187">elements</span>.<span style="color:#703daa">indices</span>.<span style="color:#3d1d81">contains</span>(index) {</div><div style="margin:0px;font-size:11px;font-family:Menlo">            <span style="color:#bb2ca2">return</span> <span style="color:#703daa">Int</span>(<span style="color:#bb2ca2">self</span>.<span style="color:#4f8187">elements</span>[index])</div><div style="margin:0px;font-size:11px;font-family:Menlo">        }</div><div style="margin:0px;font-size:11px;font-family:Menlo">        <span style="color:#bb2ca2">return</span> <span style="color:#bb2ca2">nil</span></div><div style="margin:0px;font-size:11px;font-family:Menlo">    }</div><div style="margin:0px;font-size:11px;font-family:Menlo">}</div></div><br>_______________________________________________<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>
<br></blockquote></div><br></div>