<div dir="ltr">Jordan, thanks for the clarification. It is pretty easy to check if your index is in-bounds before subscripting. Just unexpected as most things causing a runtime crash tend to be marked with a &#39;!&#39; (try!, unwrapping an optional with !, implicitly unwrapped optionals...)</div><br><div class="gmail_quote"><div dir="ltr">On Mon, Dec 14, 2015 at 6:52 PM Jordan Rose &lt;<a href="mailto:jordan_rose@apple.com">jordan_rose@apple.com</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word"><div>These are good points to bring up, Dennis. I&#39;m not one of the standard library authors, so I might not get this exactly right, but I&#39;ll try to address each point.</div><br><div></div></div><div style="word-wrap:break-word"><div><blockquote type="cite"><div>On Dec 14, 2015, at 15:40, Dennis Lysenko &lt;<a href="mailto:dennis.s.lysenko@gmail.com" target="_blank">dennis.s.lysenko@gmail.com</a>&gt; wrote:</div><br><div><div dir="ltr">Jordan, I think the inspiration here might come from Ruby. I must admit that seeing that `Array.first` returns an optional, but Array#subscript raises a runtime error when the index is out of bounds threw me for a loop. In Ruby, both Array#first and Array.subscript return an optional.<div></div></div></div></blockquote><div><br></div></div></div><div style="word-wrap:break-word"><div><div>I do remember there being a discussion about this. One of the arguments in favor of the current behavior was &quot;seq.first ?? defaultValue&quot;, which isn&#39;t too uncommon. The equivalent with an arbitrary subscript comes up much less often.</div></div></div><div style="word-wrap:break-word"><div><br><blockquote type="cite"><div><div dir="ltr"><div>If one of the original tenets of swift was to provide greater compile-time null-safety, which it definitely seems it was given the commendable emphasis on optionals being easy to use, then returning an optional would be a solid way to go about subscripting. Think of it this way: when I call a method with nullable return value, I am forced to deal with the fact that the method can fail at compile time. When I subscript an array, I am not forced to deal with it at compile time, and it will fail at runtime instead.</div><div></div></div></div></blockquote><div><br></div></div></div><div style="word-wrap:break-word"><div><div>From my perspective, array subscripting is not &quot;an operation that can fail&quot;. It just has a precondition on its input parameter. Optional return values force you to deal with <i>dynamic</i> failures, but array subscripting should never get to that point.</div><div><br></div><div>I think the equivalent would be forcing the user to check the <i>input</i> rather than the <i>output,</i> just as you are forced to check whether an optional is nil <i>before</i> using it rather than <i>after.</i> If you ignore a method return value you&#39;re not actually dealing with its failure.</div></div></div><div style="word-wrap:break-word"><div><div><br></div><br><blockquote type="cite"><div><div dir="ltr"><div>Nullable subscripting is a big departure from the way most modern languages do things and that is why I don&#39;t blame you for rejecting it. That said, it is a pleasant change in the way you think about subscripting.</div><div><br></div><div>As a closing thought, subscripting hashes returns an optional value. You might consider this a pretty big inconsistency with arrays. Let me flip your argument against optional array subscripting, for dictionaries: <span style="line-height:1.5"><b>When you are performing a subscript where the key is out of the key set, is it not a programmer error?</b></span></div></div></div></blockquote><div><br></div></div></div><div style="word-wrap:break-word"><div><div>No, it is not; it is the canonical way to tell if a key has an entry in the dictionary, and the canonical way to insert a new entry into the dictionary. The same is not true for Array.</div><div><br></div><div>(Note also that Dictionary&#39;s subscript that takes an Index does not return an optional result.)</div></div></div><div style="word-wrap:break-word"><div><div><br></div><div>Jordan</div></div></div></blockquote></div>