> On Sep 27, 2017, at 12:44 PM, Tony Allevato <[email protected]> wrote: > > > > On Wed, Sep 27, 2017 at 10:36 AM Ben Cohen via swift-evolution > <[email protected] <mailto:[email protected]>> wrote: > > >> On Sep 25, 2017, at 2:12 AM, Alwyn Concessao via swift-evolution >> <[email protected] <mailto:[email protected]>> wrote: >> >> mutating func removeElementInSubrange(_ elementToBeRemoved:Element,in >> range:Range<Index>){ >> >> //check if elementoBeRemoved exists; if yes, check if the index of >> elementToBeRemoved is part of the subrange, if yes then remove else don't >> remove. >> >> } > > Hi Alwyn, > > In general, we try to avoid methods on Collection in the standard library > that take a limiting range to operate on. > > This is something of a related aside, but since you mentioned it, is this > also the reason that there is no method like `index(of element: Element, from > index: Index) -> Index?`? >
Yep. > In those situations where I've needed to do that (e.g., a while loop that > skips from match to match) I end up falling back to slices, but historically > it's been somewhat awkward to write compared to the code I would write if > such a function exists. > > That being said, I don't believe I've tried it since Swift 4 introduced the > new partial range operators so it's possible that those simplify the pattern > quite a bit. > Hopefully! I’ve found it that way in practice e.g. https://gist.github.com/airspeedswift/e7e02943c4c4463da919a9a825f33def#file-lazysplit-swift-L14 An alternative pattern is to create a mutable slice variable, and continuously “eat” from the front of it, removing elements as you go (via removeFirst or similar). Eating from the front of a slice ought to just move the startIndex further along the base collection. > > Instead, the user can slice the collection using the range, then call the > mutating method on the slice. If done directly on the subscript, this has the > effect of mutating the parent collection: > > var a = Array(0..<10) > let isEven = { $0%2 == 0 } > > a[3...].remove(where: isEven) > // a = [0, 1, 2, 3, 5, 7, 9] > > The downside of this today is that it can be inefficient, because the mutated > slice might be copied as part of the mutaate-and-write-back. But there are > changes slated for Swift 5 that should allow this mutation to happen in place. > > > _______________________________________________ > swift-evolution mailing list > [email protected] <mailto:[email protected]> > https://lists.swift.org/mailman/listinfo/swift-evolution > <https://lists.swift.org/mailman/listinfo/swift-evolution>
_______________________________________________ swift-evolution mailing list [email protected] https://lists.swift.org/mailman/listinfo/swift-evolution
