<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div>Trying to think outside the box here.</div><div><br class=""></div><div>From limited testing I have done, the compiler does force both setter and getter to use the exact same optional wrapping, which may have driven part of the design so far. But with subscript which can fail, it could make sense to have the getter wrap Element in an optional, and have the setter use Element directly. Seems to make sense when comparing to pop()/push() operations; the first return wrapped Element, the second assigned no-wrapped Element.</div><div>&nbsp;</div><div>This would of course prevent doing</div><div><br class=""></div><div><div>array[ifExists: 0] = array[ifExists: 1]</div><div class=""><br class=""></div><div class="">but this could solved by adding a new assignment operator</div><div class=""><br class=""></div><div class=""><div>array[ifExists: 0] ?= array[ifExists: 1]</div><div class=""><br class=""></div><div class="">Which (try to) assign unwrapped rhs to lhs iff rhs is not nil. This could be useful in other scenario and has been thankfully not stolen by SE024 Optional Value Setter. Unfortunately, this could bring a request for the triple question-mark assignment: assign unwrapped rhs to lhs iff both rhs and lhs are not nil, but I’m diverting here.</div></div><div class=""><br class=""></div><div class="">A quick test with:</div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(187, 44, 162);" class="">infix<span style="font-variant-ligatures: no-common-ligatures; color: #000000" class=""> </span>operator<span style="font-variant-ligatures: no-common-ligatures; color: #000000" class=""> ?= { </span>associativity<span style="font-variant-ligatures: no-common-ligatures; color: #000000" class=""> left precedence </span><span style="font-variant-ligatures: no-common-ligatures; color: #272ad8" class="">140</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class=""> </span>assignment<span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">}</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">func</span> ?=&lt;T&gt;(left: <span style="font-variant-ligatures: no-common-ligatures; color: #703daa" class="">T</span>, right: <span style="font-variant-ligatures: no-common-ligatures; color: #703daa" class="">T</span>?) -&gt; <span style="font-variant-ligatures: no-common-ligatures; color: #703daa" class="">T</span> {</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class="">&nbsp; &nbsp; <span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">return</span> right ?? left</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class="">}</div></div><div class=""><br class=""></div><div class="">And a [ifExistSet:] and [ifExistGet:] variant look promising; but I let others dig deeper, as I do not have a use case for the setter. On the other hand, I might have some interest in the getter, which bring me to should we investigate the syntax:</div></div><div><div class=""><br class=""></div><div class="">array[?1]</div><div class=""><br class=""></div><div class="">(Recap: both array?[1] and array[1]? with any number of ? already have a meaning)</div><div class="">I’m suggesting a brief syntax due to a possible use case I stumble upon.</div><div class=""><br class=""></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(209, 47, 27);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">var</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class=""> str:</span><span style="font-variant-ligatures: no-common-ligatures; color: #703daa" class="">String</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class=""> = </span>"some user provided data with possibly some trailing garbage"</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(61, 29, 129);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">let</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class=""> tokens = </span><span style="font-variant-ligatures: no-common-ligatures; color: #4f8187" class="">str</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">.</span>componentsSeparatedByString<span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">(</span><span style="font-variant-ligatures: no-common-ligatures; color: #d12f1b" class="">" "</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">)</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(0, 132, 0);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2" class="">switch</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class=""> (</span><span style="font-variant-ligatures: no-common-ligatures; color: #4f8187" class="">tokens</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">[?</span><span style="font-variant-ligatures: no-common-ligatures; color: #272ad8" class="">0</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">], </span><span style="font-variant-ligatures: no-common-ligatures; color: #4f8187" class="">tokens</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">[?</span><span style="font-variant-ligatures: no-common-ligatures; color: #272ad8" class="">1</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">], </span><span style="font-variant-ligatures: no-common-ligatures; color: #4f8187" class="">tokens</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">[?</span><span style="font-variant-ligatures: no-common-ligatures; color: #272ad8" class="">2</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">], </span><span style="font-variant-ligatures: no-common-ligatures; color: #4f8187" class="">tokens</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">[?</span><span style="font-variant-ligatures: no-common-ligatures; color: #272ad8" class="">3</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">]) </span>// Expect 0 to 3 components</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class="">{</div><div style="margin: 0px; line-height: normal;" class=""><font face="Menlo" class=""><span style="font-size: 11px;" class="">&nbsp; &nbsp; </span></font><span style="font-family: Menlo; font-size: 11px; color: rgb(187, 44, 162);" class="">case</span><font face="Menlo" class=""><span style="font-size: 11px;" class=""> (</span></font><span style="font-family: Menlo; font-size: 11px; color: rgb(187, 44, 162);" class="">let</span><font face="Menlo" class=""><span style="font-size: 11px;" class=""> a?, </span></font><span style="font-family: Menlo; font-size: 11px; color: rgb(187, 44, 162);" class="">nil</span><font face="Menlo" class=""><span style="font-size: 11px;" class="">, </span></font><span style="font-family: Menlo; font-size: 11px; color: rgb(187, 44, 162);" class="">nil</span><font face="Menlo" class=""><span style="font-size: 11px;" class="">, </span></font><span style="font-family: Menlo; font-size: 11px; color: rgb(187, 44, 162);" class="">nil</span><font face="Menlo" class=""><span style="font-size: 11px;" class="">): </span></font><font color="#008400" face="Menlo" class=""><span style="font-size: 11px;" class="">/* Some stuff when&nbsp;only one token */</span></font></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class="">}</div></div><div class=""><br class=""></div></div><div><div>Dany</div><div class=""><br class=""></div></div><div><blockquote type="cite" class=""><div class="">Le 6 févr. 2016 à 22:48, Dave via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; a écrit :</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">I tried that already, and the complier complained that something was ambiguous. But when I did it again just now to get the actual error message, it worked! I tried switching back to extending Array instead of CollectionType, and the ambiguities reappeared:&nbsp;<div class=""><div class=""><div style="margin: 0px; line-height: normal;" class=""><span style="color: rgb(41, 161, 152); font-family: 'Fira Mono';" class="">bar[</span><font color="#93a1a1" face="Fira Mono" class="">ifExists: </font><span style="color: rgb(108, 113, 196); font-family: 'Fira Mono';" class="">3</span><span style="color: rgb(41, 161, 152); font-family: 'Fira Mono';" class="">]</span><font color="#93a1a1" face="Fira Mono" class=""> = </font><span style="color: rgb(211, 54, 130); font-family: 'Fira Mono';" class="">nil&nbsp;</span><font color="#cb4b16" face="Fira Mono" class="">// Ambiguous use of&nbsp;’subscript(ifExists:)’</font></div></div><div class=""><br class=""></div><div class="">Now, I would like to know why it’s ambiguous in one case and not the other, but it’s kind of a moot point since even when it’s working, it still allows this counter-intuitive assignment to go through:</div><div style="margin: 0px; line-height: normal; font-family: 'Fira Mono'; color: rgb(147, 161, 161);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #d33682" class="">var</span> bar: [<span style="font-variant-ligatures: no-common-ligatures; color: #278bd2" class="">Int</span>?] = [<span style="font-variant-ligatures: no-common-ligatures; color: #6c71c4" class="">1</span>]</div><div style="margin: 0px; line-height: normal; font-family: 'Fira Mono'; color: rgb(147, 161, 161);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #29a198" class="">bar[</span>ifExists: <span style="font-variant-ligatures: no-common-ligatures; color: #6c71c4" class="">0</span><span style="font-variant-ligatures: no-common-ligatures; color: #29a198" class="">]</span> = <span style="font-variant-ligatures: no-common-ligatures; color: #29a198" class="">bar[</span>ifExists: <span style="font-variant-ligatures: no-common-ligatures; color: #6c71c4" class="">6</span><span style="font-variant-ligatures: no-common-ligatures; color: #29a198" class="">]</span></div><div style="margin: 0px; line-height: normal; font-family: 'Fira Mono'; color: rgb(203, 75, 22);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #278bd2" class="">print</span><span style="font-variant-ligatures: no-common-ligatures; color: #93a1a1" class="">(</span><span style="font-variant-ligatures: no-common-ligatures; color: #29a198" class="">bar</span><span style="font-variant-ligatures: no-common-ligatures; color: #93a1a1" class="">) </span>// prints [nil], should print [Optional(1)]</div><div class=""><br class=""></div><div class="">The problem is that an unannotated nil:&nbsp;<span style="color: rgb(41, 161, 152); font-family: 'Fira Mono';" class="">bar[</span><font color="#93a1a1" face="Fira Mono" class="">ifExists:&nbsp;</font><span style="color: rgb(108, 113, 196); font-family: 'Fira Mono';" class="">3</span><span style="color: rgb(41, 161, 152); font-family: 'Fira Mono';" class="">]</span><font color="#93a1a1" face="Fira Mono" class="">&nbsp;=&nbsp;</font><span style="color: rgb(211, 54, 130); font-family: 'Fira Mono';" class="">nil</span>&nbsp;always resolves to&nbsp;<span style="color: rgb(39, 139, 210); font-family: 'Fira Mono';" class="">Optional</span><span style="font-family: 'Fira Mono'; color: rgb(147, 161, 161);" class="">&lt;</span><span style="color: rgb(39, 139, 210); font-family: 'Fira Mono';" class="">Element</span><span style="font-family: 'Fira Mono'; color: rgb(147, 161, 161);" class="">&gt;.</span><span style="color: rgb(39, 139, 210); font-family: 'Fira Mono';" class="">None</span>, but in the case where Element is itself NilLiteralConvertible, say when Element == Int?, we need the nil to resolve to&nbsp;<span style="color: rgb(39, 139, 210); font-family: 'Fira Mono';" class="">Optional</span><span style="font-family: 'Fira Mono'; color: rgb(147, 161, 161);" class="">&lt;</span><span style="color: rgb(39, 139, 210); font-family: 'Fira Mono';" class="">Optional</span><span style="font-family: 'Fira Mono'; color: rgb(147, 161, 161);" class="">&lt;</span><span style="color: rgb(39, 139, 210); font-family: 'Fira Mono';" class="">Int</span><span style="font-family: 'Fira Mono'; color: rgb(147, 161, 161);" class="">&gt;&gt;.</span><span style="color: rgb(39, 139, 210); font-family: 'Fira Mono';" class="">Some</span><span style="font-family: 'Fira Mono'; color: rgb(147, 161, 161);" class="">(</span><span style="color: rgb(39, 139, 210); font-family: 'Fira Mono';" class="">Optional</span><span style="font-family: 'Fira Mono'; color: rgb(147, 161, 161);" class="">&lt;</span><span style="color: rgb(39, 139, 210); font-family: 'Fira Mono';" class="">Int</span><span style="font-family: 'Fira Mono'; color: rgb(147, 161, 161);" class="">&gt;.</span><span style="color: rgb(39, 139, 210); font-family: 'Fira Mono';" class="">None</span><span style="font-family: 'Fira Mono'; color: rgb(147, 161, 161);" class="">)</span>. &nbsp;It’s not hard to explicitly tell the compiler to make it the “correct” kind of nil: &nbsp;<span style="color: rgb(41, 161, 152); font-family: 'Fira Mono';" class="">bar[</span><font color="#93a1a1" face="Fira Mono" class="">ifExists:&nbsp;</font><span style="color: rgb(108, 113, 196); font-family: 'Fira Mono';" class="">3</span><span style="color: rgb(41, 161, 152); font-family: 'Fira Mono';" class="">]</span><span style="color: rgb(147, 161, 161); font-family: 'Fira Mono';" class="">&nbsp;</span><span style="color: rgb(147, 161, 161); font-family: 'Fira Mono';" class="">= </span><span style="font-family: 'Fira Mono'; color: rgb(211, 54, 130);" class="">nil</span><span style="color: rgb(147, 161, 161); font-family: 'Fira Mono';" class=""> </span><span style="font-family: 'Fira Mono'; color: rgb(211, 54, 130);" class="">as</span><span style="color: rgb(147, 161, 161); font-family: 'Fira Mono';" class=""> </span><span style="font-family: 'Fira Mono'; color: rgb(39, 139, 210);" class="">Int</span><span style="color: rgb(147, 161, 161); font-family: 'Fira Mono';" class="">?</span>, but I was hoping to avoid the extra syntax, since nobody writes&nbsp;<span style="color: rgb(41, 161, 152); font-family: 'Fira Mono';" class="">foo</span><span style="color: rgb(147, 161, 161); font-family: 'Fira Mono';" class="">&nbsp;= </span><span style="font-family: 'Fira Mono'; color: rgb(211, 54, 130);" class="">nil</span>&nbsp;unless they’re actually trying to set foo to be nil. Unfortunately, that means the setter has to accept&nbsp;<span style="color: rgb(39, 139, 210); font-family: 'Fira Mono';" class="">Optional</span><span style="font-family: 'Fira Mono'; color: rgb(147, 161, 161);" class="">&lt;</span><span style="color: rgb(39, 139, 210); font-family: 'Fira Mono';" class="">T</span><span style="color: rgb(147, 161, 161); font-family: 'Fira Mono';" class="">:NilLiteralConvertible</span><span style="font-family: 'Fira Mono'; color: rgb(147, 161, 161);" class="">&gt;.</span><span style="color: rgb(39, 139, 210); font-family: 'Fira Mono';" class="">None</span>&nbsp;as a&nbsp;<span style="color: rgb(39, 139, 210); font-family: 'Fira Mono';" class="">T</span>, which makes it impossible, in the setter anyway, to tell the difference between:</div><div class=""><div style="margin: 0px; line-height: normal; font-family: 'Fira Mono'; color: rgb(147, 161, 161);" class=""><span style="color: rgb(211, 54, 130);" class="">var</span>&nbsp;bar: [<span style="color: rgb(39, 139, 210);" class="">Int</span>?] = [<span style="color: rgb(108, 113, 196);" class="">1, 2</span>]</div><div class=""><span style="color: rgb(41, 161, 152); font-family: 'Fira Mono';" class="">bar[</span><font color="#93a1a1" face="Fira Mono" class="">ifExists:&nbsp;</font><font face="Fira Mono" color="#6c71c4" class="">0</font><span style="color: rgb(41, 161, 152); font-family: 'Fira Mono';" class="">]</span><font color="#93a1a1" face="Fira Mono" class="">&nbsp;=&nbsp;</font><font face="Fira Mono" class=""><font color="#d33682" class="">nil</font><font color="#cb4b16" class="">&nbsp;//the</font></font><span style="color: rgb(203, 75, 22); font-family: 'Fira Mono';" class="">&nbsp;</span><font color="#cb4b16" face="Fira Mono" class="">bar[ifExists: 0]&nbsp;setter promotes the&nbsp;</font><span style="color: rgb(203, 75, 22); font-family: 'Fira Mono';" class="">Optional</span><span style="color: rgb(203, 75, 22); font-family: 'Fira Mono';" class="">&lt;</span><span style="color: rgb(203, 75, 22); font-family: 'Fira Mono';" class="">Optional&lt;Int&gt;&gt;.None</span><span style="color: rgb(203, 75, 22); font-family: 'Fira Mono';" class="">&nbsp;to an Optional&lt;Int&gt;.None, and then assigns it to bar[0]</span></div><div class="">and</div><div style="margin: 0px; line-height: normal;" class=""><span style="color: rgb(41, 161, 152); font-family: 'Fira Mono';" class="">bar[</span><font color="#93a1a1" face="Fira Mono" class="">ifExists:&nbsp;</font><font face="Fira Mono" color="#6c71c4" class="">1</font><span style="color: rgb(41, 161, 152); font-family: 'Fira Mono';" class="">]</span><font color="#93a1a1" face="Fira Mono" class="">&nbsp;=&nbsp;</font><span style="color: rgb(41, 161, 152); font-family: 'Fira Mono';" class="">bar[</span><font color="#93a1a1" face="Fira Mono" class="">ifExists:&nbsp;</font><span style="color: rgb(108, 113, 196); font-family: 'Fira Mono';" class="">6</span><span style="color: rgb(41, 161, 152); font-family: 'Fira Mono';" class="">]&nbsp;</span><span style="color: rgb(203, 75, 22); font-family: 'Fira Mono';" class="">// the&nbsp;</span><font color="#cb4b16" face="Fira Mono" class="">bar[ifExists:&nbsp;6] getter returns a&nbsp;Optional&lt;Optional&lt;Int&gt;&gt;.None, which the</font><span style="color: rgb(203, 75, 22); font-family: 'Fira Mono';" class="">&nbsp;</span><font color="#cb4b16" face="Fira Mono" class="">bar[ifExists: 1]&nbsp;setter then&nbsp;“promotes” to an Optional&lt;Int&gt;.None, and then assigns it to bar[1]</font></div></div><div class=""><br class=""></div><div class="">And this leads to the results of a lookup silently failing and&nbsp;then propagating through the assignment.</div><div class=""><br class=""></div><div class="">I think stuff like this is at least part of why the optional system is getting reworked.</div><div class=""><br class=""></div><div class="">
- Dave Sweeris

</div>
<br class=""><div class=""><blockquote type="cite" class=""><div class="">On Feb 6, 2016, at 16:02, David Waite &lt;<a href="mailto:david@alkaline-solutions.com" class="">david@alkaline-solutions.com</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">If implemented via extension, you could special case Self.Generator.Element:NilLiteralConvertable. Would that help? You could say in that case that an Optional.None newValue is actually Optional&lt;Element&gt;.Some(Element(nilLiteral:())).<div class=""><br class=""></div><div class="">-DW<br class=""><div class=""><br class=""><div class=""><blockquote type="cite" class=""><div class="">On Feb 6, 2016, at 4:19 PM, Dave via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">Ah, ok, I think I understand your objection now. Let me try to summarize…</div><div class=""><br class=""></div><div class="">If we extend on MutableCollectionType like this:</div><div class=""><div style="margin: 0px; line-height: normal; font-family: 'Fira Mono'; color: rgb(147, 161, 161);" class=""><span style="color: rgb(211, 54, 130);" class="">subscript</span>(ifExists idx:&nbsp;<span style="color: rgb(39, 139, 210);" class="">Self</span>.<span style="color: rgb(39, 139, 210);" class="">Index</span>) -&gt;&nbsp;<span style="color: rgb(39, 139, 210);" class="">Self</span>.<span style="color: rgb(39, 139, 210);" class="">Generator</span>.<span style="color: rgb(39, 139, 210);" class="">Element</span>? {</div><div style="margin: 0px; line-height: normal; font-family: 'Fira Mono'; color: rgb(147, 161, 161);" class="">&nbsp; &nbsp;&nbsp;<span style="color: rgb(211, 54, 130);" class="">get</span>&nbsp;{&nbsp;<span style="color: rgb(211, 54, 130);" class="">return</span>&nbsp;<span style="color: rgb(211, 54, 130);" class="">self</span>.<span style="color: rgb(39, 139, 210);" class="">indices</span>.<span style="color: rgb(39, 139, 210);" class="">contains</span>(idx) ?&nbsp;<span style="color: rgb(211, 54, 130);" class="">self</span>[idx] :&nbsp;<span style="color: rgb(211, 54, 130);" class="">nil</span>&nbsp;<span style="color: rgb(211, 54, 130);" class="">as</span>&nbsp;<span style="color: rgb(39, 139, 210);" class="">Self</span>.<span style="color: rgb(39, 139, 210);" class="">Generator</span>.<span style="color: rgb(39, 139, 210);" class="">Element</span>? }</div><div style="margin: 0px; line-height: normal; font-family: 'Fira Mono'; color: rgb(147, 161, 161);" class="">&nbsp; &nbsp;&nbsp;<span style="color: rgb(211, 54, 130);" class="">set</span>&nbsp;{&nbsp;<span style="color: rgb(211, 54, 130);" class="">if</span>&nbsp;<span style="color: rgb(211, 54, 130);" class="">let</span>&nbsp;nv = newValue&nbsp;<span style="color: rgb(211, 54, 130);" class="">where</span>&nbsp;<span style="color: rgb(211, 54, 130);" class="">self</span>.<span style="color: rgb(39, 139, 210);" class="">indices</span>.<span style="color: rgb(39, 139, 210);" class="">contains</span>(idx) {&nbsp;<span style="color: rgb(211, 54, 130);" class="">self</span>[idx] = nv } }</div><div style="margin: 0px; line-height: normal; font-family: 'Fira Mono'; color: rgb(203, 75, 22);" class=""><span style="color: rgb(147, 161, 161);" class="">}</span></div></div><div class="">then, when <span style="font-family: 'Fira Mono'; color: rgb(39, 139, 210);" class="">CollectionType.Generator</span><span style="color: rgb(147, 161, 161); font-family: 'Fira Mono';" class="">.</span><span style="font-family: 'Fira Mono'; color: rgb(39, 139, 210);" class="">Element</span>&nbsp;is&nbsp;<span style="color: rgb(39, 139, 210); font-family: 'Fira Mono';" class="">NilLiteralConvertible</span>, we have the following problem:</div><div class=""><div style="margin: 0px; line-height: normal; font-family: 'Fira Mono'; color: rgb(147, 161, 161);" class=""><span style="color: rgb(211, 54, 130);" class="">var</span> array: [<span style="color: rgb(39, 139, 210);" class="">Int</span>?] = [<span style="color: rgb(108, 113, 196);" class="">1</span>]</div></div><div class=""><div style="margin: 0px; line-height: normal;" class=""><span style="color: rgb(41, 161, 152); font-family: 'Fira Mono';" class="">array[</span><font color="#93a1a1" face="Fira Mono" class="">ifExists: </font><span style="color: rgb(108, 113, 196); font-family: 'Fira Mono';" class="">0</span><span style="color: rgb(41, 161, 152); font-family: 'Fira Mono';" class="">]</span><font color="#93a1a1" face="Fira Mono" class=""> = </font><span style="color: rgb(211, 54, 130); font-family: 'Fira Mono';" class="">nil</span><span style="color: rgb(41, 161, 152); font-family: 'Fira Mono';" class="">&nbsp;</span><font color="#cb4b16" face="FiraMono-Regular" class="">// *PROBLEM*: The most&nbsp;straight-forward way of safely setting something to nil silently fails because the compiler treats this as an Int?? instead of an Int?</font></div><div style="margin: 0px; line-height: normal; font-family: 'Fira Mono'; color: rgb(203, 75, 22);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #278bd2" class="">print</span><span style="font-variant-ligatures: no-common-ligatures; color: #93a1a1" class="">(</span><span style="font-variant-ligatures: no-common-ligatures; color: #29a198" class="">array</span><span style="font-variant-ligatures: no-common-ligatures; color: #93a1a1" class="">) </span>// "[Optional(1)]"</div><div style="margin: 0px; line-height: normal;" class=""><span style="color: rgb(41, 161, 152); font-family: 'Fira Mono';" class="">array[</span><font color="#93a1a1" face="Fira Mono" class="">ifExists: </font><span style="color: rgb(108, 113, 196); font-family: 'Fira Mono';" class="">0</span><span style="color: rgb(41, 161, 152); font-family: 'Fira Mono';" class="">]</span><font color="#93a1a1" face="Fira Mono" class=""> = </font><span style="color: rgb(41, 161, 152); font-family: 'Fira Mono';" class="">array[</span><font color="#93a1a1" face="Fira Mono" class="">ifExists: </font><span style="color: rgb(108, 113, 196); font-family: 'Fira Mono';" class="">1</span><span style="color: rgb(41, 161, 152); font-family: 'Fira Mono';" class="">]&nbsp;</span><span style="color: rgb(203, 75, 22); font-family: FiraMono-Regular;" class="">// *No problem*</span></div><div style="margin: 0px; line-height: normal; font-family: 'Fira Mono'; color: rgb(203, 75, 22);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #278bd2" class="">print</span><span style="font-variant-ligatures: no-common-ligatures; color: #93a1a1" class="">(</span><span style="font-variant-ligatures: no-common-ligatures; color: #29a198" class="">array</span><span style="font-variant-ligatures: no-common-ligatures; color: #93a1a1" class="">) </span>// "[Optional(1)]"</div><div style="margin: 0px; line-height: normal;" class=""><font face="FiraMono-Regular" class=""><span style="color: rgb(41, 161, 152);" class="">array[</span><font color="#93a1a1" class="">ifExists: </font><span style="color: rgb(108, 113, 196);" class="">0</span><span style="color: rgb(41, 161, 152);" class="">]</span><font color="#93a1a1" class=""> = </font><span style="color: rgb(211, 54, 130);" class="">nil</span> <span style="color: rgb(211, 54, 130);" class="">as</span> <span style="color: rgb(39, 139, 210);" class="">Int</span><font color="#93a1a1" class="">?&nbsp;</font></font><span style="color: rgb(203, 75, 22); font-family: FiraMono-Regular;" class="">// *No problem*</span></div><div style="margin: 0px; line-height: normal; font-family: 'Fira Mono'; color: rgb(203, 75, 22);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #278bd2" class="">print</span><span style="font-variant-ligatures: no-common-ligatures; color: #93a1a1" class="">(</span><span style="font-variant-ligatures: no-common-ligatures; color: #29a198" class="">array</span><span style="font-variant-ligatures: no-common-ligatures; color: #93a1a1" class="">) </span>// "[nil]"</div><div style="margin: 0px; line-height: normal; font-family: 'Fira Mono'; color: rgb(147, 161, 161); min-height: 14px;" class=""><br class=""></div></div><div style="margin: 0px; line-height: normal; min-height: 14px;" class="">But if we fix it to allow an unannotated&nbsp;<span style="color: rgb(211, 54, 130); font-family: 'Fira Mono';" class="">nil</span>&nbsp;to go through:</div><div style="margin: 0px; line-height: normal; min-height: 14px;" class=""><div style="margin: 0px; line-height: normal; font-family: 'Fira Mono'; color: rgb(39, 139, 210);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #d33682" class="">subscript</span><span style="font-variant-ligatures: no-common-ligatures; color: #93a1a1" class="">(ifExists idx: </span>Self<span style="font-variant-ligatures: no-common-ligatures; color: #93a1a1" class="">.</span>Index<span style="font-variant-ligatures: no-common-ligatures; color: #93a1a1" class="">) -&gt; </span>Self<span style="font-variant-ligatures: no-common-ligatures; color: #93a1a1" class="">.</span>Generator<span style="font-variant-ligatures: no-common-ligatures; color: #93a1a1" class="">.</span>Element<span style="font-variant-ligatures: no-common-ligatures; color: #93a1a1" class="">? {</span></div><div style="margin: 0px; line-height: normal; font-family: 'Fira Mono'; color: rgb(147, 161, 161);" class="">&nbsp; &nbsp; <span style="font-variant-ligatures: no-common-ligatures; color: #d33682" class="">get</span> { <span style="font-variant-ligatures: no-common-ligatures; color: #d33682" class="">return</span> <span style="font-variant-ligatures: no-common-ligatures; color: #d33682" class="">self</span>.indices.contains(idx) ? <span style="font-variant-ligatures: no-common-ligatures; color: #d33682" class="">self</span>[idx] : <span style="font-variant-ligatures: no-common-ligatures; color: #d33682" class="">nil</span> <span style="font-variant-ligatures: no-common-ligatures; color: #d33682" class="">as</span> <span style="font-variant-ligatures: no-common-ligatures; color: #278bd2" class="">Self</span>.<span style="font-variant-ligatures: no-common-ligatures; color: #278bd2" class="">Generator</span>.<span style="font-variant-ligatures: no-common-ligatures; color: #278bd2" class="">Element</span>? }</div><div style="margin: 0px; line-height: normal; font-family: 'Fira Mono'; color: rgb(203, 75, 22);" class=""><span style="color: rgb(147, 161, 161);" class="">&nbsp; &nbsp;&nbsp;</span><span style="color: rgb(211, 54, 130);" class="">set</span><span style="color: rgb(147, 161, 161);" class=""> {</span></div><div style="margin: 0px; line-height: normal; font-family: 'Fira Mono'; color: rgb(147, 161, 161);" class="">&nbsp; &nbsp; &nbsp; &nbsp; <span style="font-variant-ligatures: no-common-ligatures; color: #d33682" class="">if</span> <span style="font-variant-ligatures: no-common-ligatures; color: #d33682" class="">self</span>.indices.contains(idx) {</div><div style="margin: 0px; line-height: normal; font-family: 'Fira Mono'; color: rgb(147, 161, 161);" class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="font-variant-ligatures: no-common-ligatures; color: #d33682" class="">if</span> <span style="font-variant-ligatures: no-common-ligatures; color: #d33682" class="">let</span> nv = newValue {</div><div style="margin: 0px; line-height: normal; font-family: 'Fira Mono'; color: rgb(147, 161, 161);" class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="font-variant-ligatures: no-common-ligatures; color: #d33682" class="">self</span>[idx] = nv</div><div style="margin: 0px; line-height: normal; font-family: 'Fira Mono'; color: rgb(147, 161, 161);" class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } <span style="font-variant-ligatures: no-common-ligatures; color: #d33682" class="">else</span> {</div><div style="margin: 0px; line-height: normal; font-family: 'Fira Mono'; color: rgb(147, 161, 161);" class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="font-variant-ligatures: no-common-ligatures; color: #d33682" class="">if</span> <span style="font-variant-ligatures: no-common-ligatures; color: #d33682" class="">let</span> nilType = <span style="font-variant-ligatures: no-common-ligatures; color: #d33682" class="">self</span>[idx] <span style="font-variant-ligatures: no-common-ligatures; color: #d33682" class="">as</span>? <span style="font-variant-ligatures: no-common-ligatures; color: #278bd2" class="">NilLiteralConvertible</span> {</div><div style="margin: 0px; line-height: normal; font-family: 'Fira Mono'; color: rgb(147, 161, 161);" class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="font-variant-ligatures: no-common-ligatures; color: #d33682" class="">self</span>[idx] = (nilType.<span style="font-variant-ligatures: no-common-ligatures; color: #d33682" class="">dynamicType</span>.<span style="font-variant-ligatures: no-common-ligatures; color: #d33682" class="">init</span>(nilLiteral: ()) <span style="font-variant-ligatures: no-common-ligatures; color: #d33682" class="">as</span>! <span style="font-variant-ligatures: no-common-ligatures; color: #278bd2" class="">Self</span>.<span style="font-variant-ligatures: no-common-ligatures; color: #278bd2" class="">Generator</span>.<span style="font-variant-ligatures: no-common-ligatures; color: #278bd2" class="">Element</span>)</div><div style="margin: 0px; line-height: normal; font-family: 'Fira Mono'; color: rgb(147, 161, 161);" class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div style="margin: 0px; line-height: normal; font-family: 'Fira Mono'; color: rgb(147, 161, 161);" class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div style="margin: 0px; line-height: normal; font-family: 'Fira Mono'; color: rgb(147, 161, 161);" class="">&nbsp; &nbsp; &nbsp; &nbsp; }</div><div style="margin: 0px; line-height: normal; font-family: 'Fira Mono'; color: rgb(147, 161, 161);" class="">&nbsp; &nbsp; }</div><div style="margin: 0px; line-height: normal; font-family: 'Fira Mono'; color: rgb(147, 161, 161);" class="">}</div><div class="">then we have a different problem:</div></div><div style="margin: 0px; line-height: normal; min-height: 14px;" class=""><div style="margin: 0px; line-height: normal;" class=""><div style="color: rgb(147, 161, 161); font-family: 'Fira Mono';" class=""><div style="margin: 0px; line-height: normal;" class=""><span style="color: rgb(211, 54, 130);" class="">var</span>&nbsp;array: [<span style="color: rgb(39, 139, 210);" class="">Int</span>?] = [<span style="color: rgb(108, 113, 196);" class="">1, 2, 3</span>]</div></div><div class=""><div style="color: rgb(147, 161, 161); font-family: 'Fira Mono'; margin: 0px; line-height: normal;" class=""><span style="color: rgb(41, 161, 152);" class="">array[</span>ifExists: <span style="color: rgb(108, 113, 196);" class="">0</span><span style="color: rgb(41, 161, 152);" class="">]</span> = <span style="color: rgb(211, 54, 130);" class="">nil&nbsp;</span><span style="color: rgb(203, 75, 22); font-family: FiraMono-Regular;" class="">// *No problem*: The code no longer cares that this is an Int?? instead of an Int?</span></div></div><div class=""><div style="color: rgb(203, 75, 22); font-family: 'Fira Mono'; margin: 0px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #278bd2" class="">print</span><span style="font-variant-ligatures: no-common-ligatures; color: #93a1a1" class="">(</span><span style="font-variant-ligatures: no-common-ligatures; color: #29a198" class="">array</span><span style="font-variant-ligatures: no-common-ligatures; color: #93a1a1" class="">) </span>// "[nil, Optional(2), Optional(3)]"</div><div style="margin: 0px; line-height: normal;" class=""><span style="color: rgb(41, 161, 152); font-family: 'Fira Mono';" class="">array[</span><font color="#93a1a1" face="Fira Mono" class="">ifExists: </font><span style="color: rgb(108, 113, 196); font-family: 'Fira Mono';" class="">1</span><span style="color: rgb(41, 161, 152); font-family: 'Fira Mono';" class="">]</span><font color="#93a1a1" face="Fira Mono" class=""> = </font><span style="color: rgb(41, 161, 152); font-family: 'Fira Mono';" class="">array[</span><font color="#93a1a1" face="Fira Mono" class="">ifExists: </font><span style="color: rgb(108, 113, 196); font-family: 'Fira Mono';" class="">3</span><span style="color: rgb(41, 161, 152); font-family: 'Fira Mono';" class="">]</span><font color="#cb4b16" style="color: rgb(147, 161, 161); font-family: FiraMono-Regular;" class="">&nbsp;</font><font color="#cb4b16" face="FiraMono-Regular" class="">// *PROBLEM*: This shouldn’t do anything, but it succeeds because the&nbsp;code no longer cares that it’s an Int?? instead of an Int?</font></div><div style="color: rgb(203, 75, 22); font-family: 'Fira Mono'; margin: 0px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #278bd2" class="">print</span><span style="font-variant-ligatures: no-common-ligatures; color: #93a1a1" class="">(</span><span style="font-variant-ligatures: no-common-ligatures; color: #29a198" class="">array</span><span style="font-variant-ligatures: no-common-ligatures; color: #93a1a1" class="">) </span>// "[nil, nil, Optional(3)]"</div><div style="color: rgb(147, 161, 161); font-family: 'Fira Mono'; margin: 0px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #29a198" class="">array[</span>ifExists: <span style="font-variant-ligatures: no-common-ligatures; color: #6c71c4" class="">2</span><span style="font-variant-ligatures: no-common-ligatures; color: #29a198" class="">]</span> = <span style="font-variant-ligatures: no-common-ligatures; color: #d33682" class="">nil</span> <span style="font-variant-ligatures: no-common-ligatures; color: #d33682" class="">as</span> <span style="font-variant-ligatures: no-common-ligatures; color: #278bd2" class="">Int</span>?<font face="FiraMono-Regular" style="" class=""><font color="#93a1a1" class="">&nbsp;</font></font><span style="color: rgb(203, 75, 22); font-family: FiraMono-Regular;" class="">// *No problem*</span></div><div style="color: rgb(203, 75, 22); font-family: 'Fira Mono'; margin: 0px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #278bd2" class="">print</span><span style="font-variant-ligatures: no-common-ligatures; color: #93a1a1" class="">(</span><span style="font-variant-ligatures: no-common-ligatures; color: #29a198" class="">array</span><span style="font-variant-ligatures: no-common-ligatures; color: #93a1a1" class="">) </span>// "[nil, nil, nil]"</div><div style="color: rgb(147, 161, 161); font-family: 'Fira Mono';" class=""><br class=""></div></div></div></div><div class="">Assuming we’re all on the same page now… Yeah, as much as I’d love to keep the&nbsp;<span style="font-family: 'Fira Mono'; color: rgb(41, 161, 152);" class="">array[</span><span style="color: rgb(147, 161, 161); font-family: 'Fira Mono';" class="">ifExists:&nbsp;</span><span style="font-family: 'Fira Mono'; color: rgb(108, 113, 196);" class="">0</span><span style="font-family: 'Fira Mono'; color: rgb(41, 161, 152);" class="">]</span><span style="color: rgb(147, 161, 161); font-family: 'Fira Mono';" class="">&nbsp;=&nbsp;</span><span style="font-family: 'Fira Mono'; color: rgb(211, 54, 130);" class="">nil</span> behavior from the “fixed” version, I agree that the 2nd problem is clearly worse than the 1st, especially since being explicit about your nils (<span style="font-family: 'Fira Mono'; color: rgb(41, 161, 152);" class="">array[</span><span style="color: rgb(147, 161, 161); font-family: 'Fira Mono';" class="">ifExists: </span><span style="font-family: 'Fira Mono';" class=""><font color="#6c71c4" class="">0</font></span><span style="font-family: 'Fira Mono'; color: rgb(41, 161, 152);" class="">]</span><span style="color: rgb(147, 161, 161); font-family: 'Fira Mono';" class="">&nbsp;=&nbsp;</span><span style="font-family: 'Fira Mono'; color: rgb(211, 54, 130);" class="">nil</span><span style="color: rgb(147, 161, 161); font-family: 'Fira Mono';" class="">&nbsp;</span><span style="font-family: 'Fira Mono'; color: rgb(211, 54, 130);" class="">as</span><span style="color: rgb(147, 161, 161); font-family: 'Fira Mono';" class="">&nbsp;</span><span style="font-family: 'Fira Mono'; color: rgb(39, 139, 210);" class="">Int</span><span style="color: rgb(147, 161, 161); font-family: 'Fira Mono';" class="">?</span>) allows the assignment to go through.</div><div class=""><br class=""></div><div class="">So I’m in favor of the 1st one, which doesn’t allow unannotated nil assignments to succeed.</div><div class=""><br class=""></div><div class="">The only alternative I can think of is changing the language to allow subscripts to throw errors:</div><div class=""><div style="margin: 0px; line-height: normal; font-family: 'Fira Mono'; color: rgb(147, 161, 161);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #d33682" class="">enum</span> IndexError : <span style="font-variant-ligatures: no-common-ligatures; color: #278bd2" class="">ErrorType</span> { <span style="font-variant-ligatures: no-common-ligatures; color: #d33682" class="">case</span> outOfRange }</div><div style="margin: 0px; line-height: normal; font-family: 'Fira Mono'; color: rgb(147, 161, 161);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #d33682" class="">subscript</span>(throwing idx: <span style="font-variant-ligatures: no-common-ligatures; color: #d33682" class="">Self</span>.Index) <span style="font-variant-ligatures: no-common-ligatures; color: #d33682" class="">throws</span> -&gt;&nbsp;<span style="color: rgb(39, 139, 210);" class="">Self</span>.<span style="color: rgb(39, 139, 210);" class="">Generator</span>.<span style="color: rgb(39, 139, 210);" class="">Element</span>&nbsp;{</div><div style="margin: 0px; line-height: normal; font-family: 'Fira Mono'; color: rgb(147, 161, 161);" class="">&nbsp; &nbsp; <span style="color: rgb(211, 54, 130);" class="">get</span>&nbsp;{</div><div style="margin: 0px; line-height: normal; font-family: 'Fira Mono'; color: rgb(147, 161, 161);" class="">&nbsp; &nbsp; &nbsp; &nbsp; <span style="font-variant-ligatures: no-common-ligatures; color: #d33682" class="">guard</span> <span style="font-variant-ligatures: no-common-ligatures; color: #d33682" class="">self</span>.<span style="color: rgb(39, 139, 210);" class="">indices</span>.<span style="color: rgb(39, 139, 210);" class="">contains</span>(idx)&nbsp;<span style="color: rgb(211, 54, 130);" class="">else</span> { <span style="color: rgb(211, 54, 130);" class="">throw</span> <span style="color: rgb(41, 161, 152);" class="">IndexError</span>.<span style="color: rgb(41, 161, 152);" class="">outOfRange</span> }</div><div style="margin: 0px; line-height: normal; font-family: 'Fira Mono'; color: rgb(147, 161, 161);" class="">&nbsp; &nbsp; &nbsp; &nbsp; <span style="font-variant-ligatures: no-common-ligatures; color: #d33682" class="">return</span> <span style="font-variant-ligatures: no-common-ligatures; color: #d33682" class="">self</span>[idx]</div><div style="margin: 0px; line-height: normal; font-family: 'Fira Mono'; color: rgb(147, 161, 161);" class="">&nbsp; &nbsp; }</div><div style="margin: 0px; line-height: normal; font-family: 'Fira Mono'; color: rgb(147, 161, 161);" class=""><font color="#93a1a1" face="Fira Mono" class="">&nbsp; &nbsp;&nbsp;</font><span style="color: rgb(211, 54, 130);" class="">set</span><font color="#93a1a1" face="Fira Mono" class="">&nbsp;{</font></div><div style="margin: 0px; line-height: normal; font-family: 'Fira Mono'; color: rgb(147, 161, 161);" class="">&nbsp; &nbsp; &nbsp; &nbsp; <span style="font-variant-ligatures: no-common-ligatures; color: #d33682" class="">guard</span> <span style="font-variant-ligatures: no-common-ligatures; color: #d33682" class="">self</span>.<span style="color: rgb(39, 139, 210);" class="">indices</span>.<span style="color: rgb(39, 139, 210);" class="">contains</span>(idx)&nbsp;<span style="color: rgb(211, 54, 130);" class="">else</span> { <span style="color: rgb(211, 54, 130);" class="">throw</span>&nbsp;<span style="color: rgb(41, 161, 152);" class="">IndexError</span>.<span style="color: rgb(41, 161, 152);" class="">outOfRange</span>&nbsp;}</div><div style="margin: 0px; line-height: normal; font-family: 'Fira Mono'; color: rgb(147, 161, 161);" class="">&nbsp; &nbsp; &nbsp; &nbsp; <span style="font-variant-ligatures: no-common-ligatures; color: #d33682" class="">self</span>[idx] = newValue</div><div style="margin: 0px; line-height: normal; font-family: 'Fira Mono'; color: rgb(147, 161, 161);" class="">&nbsp; &nbsp; }</div><div style="margin: 0px; line-height: normal; font-family: 'Fira Mono'; color: rgb(147, 161, 161);" class="">}</div></div><div class=""><br class=""></div><div class="">Although… They aren’t mutually exclusive… It’s obviously not hard to imagine scenarios in which you don’t really care that you're out of bounds and just want to avoid crashing (otherwise we wouldn’t have been having this conversation in the first place) but nor is it hard to imagine scenarios in which you might want explicit confirmation that there wasn’t an error, rather than having to check for nil or compare before &amp; after versions of the array. In those cases the throwing version would be appropriate. Plus, if your subscript function doesn’t only pass-through to an underlying collection, it might be handy to be able to throw, say, an OutOfMemory error if your subscript function loads or generates some large data structure. Or perhaps you’re writing a file manager, and you’re trying to get files by “subscripting” directories… The file may exist, but you might not have read permission.</div><div class=""><br class=""></div><div class="">Should we propose both?</div><div class=""><br class=""></div><div class="">- Dave Sweeris</div>
<br class=""><div class=""><blockquote type="cite" class=""><div class="">On Feb 6, 2016, at 12:52, Maximilian Hünenberger via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="content-type" content="text/html; charset=utf-8" class=""><div dir="auto" class=""><div class=""></div><div class="">Probably I wasn't clear about that. Sorry.</div><div class=""><br class=""></div><div class="">My concern was about adding (code from Dave Sweeris):</div><div class=""><br class=""></div><div class=""><div class="" style="margin: 0px; line-height: normal;"><span style="background-color: rgba(255, 255, 255, 0);" class=""><span class="">extension</span>&nbsp;<span class="">Array</span>&nbsp;<span class="">where</span>&nbsp;Element: NilLiteralConvertible {</span></div><div class="" style="margin: 0px; line-height: normal;"><span style="background-color: rgba(255, 255, 255, 0);" class="">&nbsp; &nbsp;&nbsp;<span class="">subscript</span>(ifExists idx:&nbsp;<span class="">Index</span>) -&gt;&nbsp;<span class="">Element</span>? {</span></div><div class="" style="margin: 0px; line-height: normal;"><span style="background-color: rgba(255, 255, 255, 0);" class="">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span class="">get</span>&nbsp;{&nbsp;<span class="">return</span>&nbsp;(<span class="">startIndex</span>&nbsp;..&lt;&nbsp;<span class="">endIndex</span>) ~= idx ?&nbsp;<span class="">self</span>[idx] :&nbsp;<span class="">nil</span>&nbsp;}</span></div><div class="" style="margin: 0px; line-height: normal;"><span style="background-color: rgba(255, 255, 255, 0);" class="">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span class="">set</span>&nbsp;{&nbsp;<span class="">if</span>&nbsp;(<span class="">startIndex</span>&nbsp;..&lt;&nbsp;<span class="">endIndex</span>) ~= idx {&nbsp;<span class="">self</span>[idx] = newValue ?? Element(nilLiteral: ())} }</span></div><div class="" style="margin: 0px; line-height: normal;"><span style="background-color: rgba(255, 255, 255, 0);" class="">&nbsp; &nbsp;&nbsp;}</span></div><div class="" style="margin: 0px; line-height: normal;"><span style="background-color: rgba(255, 255, 255, 0);" class="">}</span></div></div><div class="" style="margin: 0px; line-height: normal;"><span style="background-color: rgba(255, 255, 255, 0);" class=""><br class=""></span></div><div class="" style="margin: 0px; line-height: normal;"><span style="background-color: rgba(255, 255, 255, 0);" class=""><br class=""></span></div><div class="" style="margin: 0px; line-height: normal;"><span style="background-color: rgba(255, 255, 255, 0);" class="">Since it would allow this:</span></div><div class="" style="margin: 0px; line-height: normal;"><span style="background-color: rgba(255, 255, 255, 0);" class=""><br class=""></span></div><div class="" style="margin: 0px; line-height: normal;"><span style="background-color: rgba(255, 255, 255, 0);" class="">var array: [Int?] = [1]</span></div><div class="" style="margin: 0px; line-height: normal;"><span style="background-color: rgba(255, 255, 255, 0);" class="">array[ifExists: 0] = nil // sets array[0] to nil if index is valid</span></div><div class="" style="margin: 0px; line-height: normal;"><span style="background-color: rgba(255, 255, 255, 0);" class="">print(array) // "[nil]"</span></div><div class="" style="margin: 0px; line-height: normal;">array = [1]</div><div class="" style="margin: 0px; line-height: normal;"><span style="background-color: rgba(255, 255, 255, 0);" class="">array[ifExists: 0] =&nbsp;array[ifExists: 1]</span></div><div class="" style="margin: 0px; line-height: normal;"><span style="background-color: rgba(255, 255, 255, 0);" class="">print(array) // "[nil]"</span></div><div class="" style="margin: 0px; line-height: normal;"><span style="background-color: rgba(255, 255, 255, 0);" class=""><br class=""></span></div><div class="" style="margin: 0px; line-height: normal;"><span style="background-color: rgba(255, 255, 255, 0);" class="">Whereas the normal behavior:</span></div><div class="" style="margin: 0px; line-height: normal;"><span style="background-color: rgba(255, 255, 255, 0);" class=""><br class=""></span></div><div class="" style="margin: 0px; line-height: normal;"><div class="" style="margin: 0px; line-height: normal;"><span style="background-color: rgba(255, 255, 255, 0);" class="">var array: [Int?] = [1]</span></div><div class="" style="margin: 0px; line-height: normal;"><span style="background-color: rgba(255, 255, 255, 0);" class="">array[ifExists: 0] = nil // does nothing</span></div><div class="" style="margin: 0px; line-height: normal;"><span style="background-color: rgba(255, 255, 255, 0);" class="">print(array) // "[1]"</span></div><div class="" style="margin: 0px; line-height: normal;"><div class="" style="margin: 0px; line-height: normal;"><span style="background-color: rgba(255, 255, 255, 0);" class="">array[ifExists: 0] =&nbsp;array[ifExists: 1] // does nothing</span></div><div class="" style="margin: 0px; line-height: normal;"><span style="background-color: rgba(255, 255, 255, 0);" class="">print(array) // "[1]"</span></div></div><div class="" style="margin: 0px; line-height: normal;"><span style="background-color: rgba(255, 255, 255, 0);" class=""><br class=""></span></div><div class="" style="margin: 0px; line-height: normal;"><span style="background-color: rgba(255, 255, 255, 0);" class=""><br class=""></span></div><div class="" style="margin: 0px; line-height: normal;"><span style="background-color: rgba(255, 255, 255, 0);" class="">Hope this clarifies my point</span></div><div class="" style="margin: 0px; line-height: normal;"><span style="background-color: rgba(255, 255, 255, 0);" class="">- Maximilian</span></div></div><div class=""><br class="">Am 06.02.2016 um 21:31 schrieb Thorsten Seitz &lt;<a href="mailto:tseitz42@icloud.com" class="">tseitz42@icloud.com</a>&gt;:<br class=""><br class=""></div><blockquote type="cite" class=""><div class=""><meta http-equiv="content-type" content="text/html; charset=utf-8" class=""><div class=""></div><div class=""><br class=""></div><div class=""><br class="">Am 06.02.2016 um 00:58 schrieb Maximilian Hünenberger via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt;:<br class=""><br class=""></div><blockquote type="cite" class=""><div class=""><meta http-equiv="content-type" content="text/html; charset=utf-8" class=""><div class=""></div><div class="">You are totally right. The return type is "Int??".</div><div class=""><br class=""></div><div class="">My point was that if we allowed something like this (as suggested by Dave Sweeris I think):</div><div class=""><br class=""></div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; var array: [Int?] = [1]</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; array[ifExists: 0] = nil</div><div class=""><br class=""></div><div class="">To set the element at index 0 to nil instead of doing nothing.</div><div class="">The next example would also set index 0 to nil even though the getter failed:</div><div class=""><br class=""></div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="background-color: rgba(255, 255, 255, 0);" class="">array[ifExists: 0] =&nbsp;array[ifExists: 1]</span></div></div></blockquote><div class=""><br class=""></div>No, it doesn't. Just try it out.<div class=""><br class=""></div><div class="">-Thorsten&nbsp;</div><div class=""><br class=""></div><div class=""><br class=""><blockquote type="cite" class=""><div class=""><div class=""><br class=""></div><div class=""><br class=""></div><div class="">- Maximilian</div><div class=""><br class="">Am 05.02.2016 um 10:20 schrieb Haravikk &lt;<a href="mailto:swift-evolution@haravikk.me" class="">swift-evolution@haravikk.me</a>&gt;:<br class=""><br class=""></div><blockquote type="cite" class=""><div class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><br class=""><div class=""><blockquote type="cite" class=""><div class="">On 4 Feb 2016, at 20:24, Maximilian Hünenberger via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">I just realized that the normal setter for failable lookups is very nice in case of assigning/swapping:</div><div class=""><br class=""></div><div class=""><blockquote type="cite" class=""><div class="" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div class=""><div class="" style="margin: 0px; line-height: normal; font-family: 'Fira Mono'; color: rgb(147, 161, 161);"><div class="" style="margin: 0px; line-height: normal; color: rgb(211, 54, 130);">extension<span class="" style="color: rgb(147, 161, 161);">&nbsp;</span><span class="" style="color: rgb(39, 139, 210);">Array</span><span class="" style="color: rgb(147, 161, 161);">&nbsp;{</span></div><div class="" style="margin: 0px; line-height: normal;">&nbsp; &nbsp;&nbsp;<span class="" style="color: rgb(211, 54, 130);">subscript</span>(ifExists idx:&nbsp;<span class="" style="color: rgb(39, 139, 210);">Index</span>) -&gt;&nbsp;<span class="" style="color: rgb(39, 139, 210);">Element</span>? {</div><div class="" style="margin: 0px; line-height: normal;">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span class="" style="color: rgb(211, 54, 130);">get</span>&nbsp;{&nbsp;<span class="" style="color: rgb(211, 54, 130);">return</span>&nbsp;(<span class="" style="color: rgb(39, 139, 210);">startIndex</span>&nbsp;..&lt;&nbsp;<span class="" style="color: rgb(39, 139, 210);">endIndex</span>) ~= idx ?&nbsp;<span class="" style="color: rgb(211, 54, 130);">self</span>[idx] :&nbsp;<span class="" style="color: rgb(211, 54, 130);">nil</span>&nbsp;}</div><div class="" style="margin: 0px; line-height: normal;">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span class="" style="color: rgb(211, 54, 130);">set</span>&nbsp;{&nbsp;<span class="" style="color: rgb(211, 54, 130);">if</span>&nbsp;(<span class="" style="color: rgb(39, 139, 210);">startIndex</span>&nbsp;..&lt;&nbsp;<span class="" style="color: rgb(39, 139, 210);">endIndex</span>) ~= idx &amp;&amp; newValue !=&nbsp;<span class="" style="color: rgb(211, 54, 130);">nil</span>&nbsp;{&nbsp;<span class="" style="color: rgb(211, 54, 130);">self</span>[idx] = newValue! } }</div><div class="" style="margin: 0px; line-height: normal;">&nbsp; &nbsp; }</div><div class="" style="margin: 0px; line-height: normal;">}</div></div></div></div></blockquote></div><div class=""><br class=""></div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; // array[index1] is only set if both indexes are valid</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; array[ifExists: index1] = array[ifExists: index2]&nbsp;</div><div class=""><br class=""></div><div class=""><br class=""></div><div class="">if array is of type [Int?] and the special setter for optional Elements would have been added:</div><div class=""><br class=""></div><div class="">array[index1] would be set to "nil" if array[index2] is nil <b style="text-decoration: underline;" class="">or</b>&nbsp;index2 is not valid which is unfortunate.</div></div></div></blockquote></div><br class=""><div class="">Wouldn’t the return type be Int?? in this case? It’s not as pretty to test for as a plain Int? but iirc you can still distinguish a return type of nil from an optional that happens to contain nil, which should allow you to tell the difference between a nil value and an invalid index, I just can’t recall how at the moment (as I design around cases like these like my life depends on it ;)</div></div></blockquote></div></blockquote><blockquote type="cite" class=""><div class=""><span class="">_______________________________________________</span><br class=""><span class="">swift-evolution mailing list</span><br class=""><span class=""><a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a></span><br class=""><span class=""><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" class="">https://lists.swift.org/mailman/listinfo/swift-evolution</a></span><br class=""></div></blockquote></div></div></blockquote></div>_______________________________________________<br class="">swift-evolution mailing list<br class=""><a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a><br class=""><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" class="">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br class=""></div></blockquote></div><br class=""></div>_______________________________________________<br class="">swift-evolution mailing list<br class=""><a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a><br class=""><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" class="">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br class=""></div></blockquote></div><br class=""></div></div></div></div></blockquote></div><br class=""></div></div>_______________________________________________<br class="">swift-evolution mailing list<br class=""><a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a><br class="">https://lists.swift.org/mailman/listinfo/swift-evolution<br class=""></div></blockquote></div><br class=""></body></html>