<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=""><br class=""><div><blockquote type="cite" class=""><div class="">On 19 Jun 2016, at 11:12, Haravikk via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; wrote:</div><div class=""><div class="" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><br class=""></div><div class="" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;">I think the following should work for the generic case, and is pretty similar:</div><div class="" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><br class=""></div><blockquote class="" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; margin: 0px 0px 0px 40px; border: none; padding: 0px;"><div class=""><font face="Monaco" class="">extension MutableCollection {</font></div><div class=""><font face="Monaco" class=""><span class="Apple-tab-span" style="white-space: pre;">        </span>public mutating func remove(indices: Set&lt;Index&gt;) {</font></div><div class=""><font face="Monaco" class=""><span class="Apple-tab-span" style="white-space: pre;">                </span>var index = self.startIndex</font></div><div class=""><font face="Monaco" class=""><span class="Apple-tab-span" style="white-space: pre;">                </span>self = self.filter {</font></div><div class=""><font face="Monaco" class=""><span class="Apple-tab-span" style="white-space: pre;">                        </span>let result = indices.contains(index)</font></div><div class=""><font face="Monaco" class=""><span class="Apple-tab-span" style="white-space: pre;">                        </span>self.formIndex(after: &amp;index)</font></div><div class=""><font face="Monaco" class=""><span class="Apple-tab-span" style="white-space: pre;">                        </span>return result</font></div><div class=""><font face="Monaco" class=""><span class="Apple-tab-span" style="white-space: pre;">                </span>}</font></div><div class=""><font face="Monaco" class=""><span class="Apple-tab-span" style="white-space: pre;">        </span>}</font></div><div class=""><font face="Monaco" class="">}</font></div></blockquote></div></blockquote><br class=""></div><div>Apologies for the double-post but I’m honour bound to follow up that my generic method is a load of nonsense at the moment; it’s missing some kind of constructor (I don’t recall if there’s a common option that will satisfy this), also, due to the way .filter {} currently works even in its lazy form it can end up calling the filter closure more than once per item, so advancing the index currently won’t work as expected (elements are skipped, children murdered, it’s just the worst).</div><div><br class=""></div><div>So yeah, best option to do this right now is with a proper loop over self.indices, but it still requires some kind constructor to build a new copy of the correct type.</div><div><br class=""></div><div>For arrays this is a bit simpler as you *can* safely remove indices in reverse order, since later indices cannot invalidate earlier ones, but this is reliant on the array’s indices being integers (reasonable enough, but not really correct in the strictest sense), so like so:</div><div><br class=""></div><div><font face="Monaco" class=""><span class="Apple-tab-span" style="white-space:pre">        </span>extension Array {</font></div><div><font face="Monaco" class=""><span class="Apple-tab-span" style="white-space:pre">                </span>public mutating func remove(indices: Set&lt;Index&gt;) {</font></div><div><font face="Monaco" class=""><span class="Apple-tab-span" style="white-space:pre">                        </span>for eachIndex in indices.sort(&gt;) { // greater than should give descending order</font></div><div><font face="Monaco" class=""><span class="Apple-tab-span" style="white-space:pre">                                </span>self.remove(at: eachIndex)</font></div><div><font face="Monaco" class=""><span class="Apple-tab-span" style="white-space:pre">                        </span>}</font></div><div><font face="Monaco" class=""><span class="Apple-tab-span" style="white-space:pre">                </span>}</font></div><div><font face="Monaco" class=""><span class="Apple-tab-span" style="white-space:pre">        </span>}</font></div><div><br class=""></div><div>But yeah, this is only safe on types where removing later items does not change the order of earlier ones, though this should be true on Array, Dictionary and Set since none of these shrink as elements are removed, it’s not strictly a good idea to rely on this behaviour as it’s implementation dependent, even though it’s unlikely this will change.</div></body></html>