> On 17 Oct 2016, at 23:20, Max Moiseev <mois...@apple.com> wrote:
>
> Hi Louis,
>
> I believe, sometimes there are situations where you know for sure that your
> collection is not empty. Maybe you are already in the context where the check
> has been performed. In these cases there is no reason you’d have to pay the
> price of an emptiness check once again.
>
> Perhaps, it should be documented better, as in “popLast should generally be
> preferred since it is safer to use. You should only opt for the removeLast if
> you are certain the collection is not empty and performance is an issue”.
>
> If you agree, mind sending us a pull request with such a documentation change?
>
> Thanks!
> Max
>
>> On Oct 17, 2016, at 2:19 PM, Louis D'hauwe <louisdha...@silverfox.be
>> <mailto:louisdha...@silverfox.be>> wrote:
>>
>> I see, the really issue I'm trying to bring up is that removeLast() can
>> easily fail (and result in a fatal error).
>> And unless you read the documentation, that's not very obvious.
>>
>> Maybe another approach would be to make removeLast() throw an exception if
>> the collection is empty?
>> That way you can use "try" to safely remove the last item of a collection.
>>
>> The reasoning behind this is that right now, to safely use removeLast(), you
>> pretty much have to do something like this:
>> if !collection.isEmpty {
>> collection.removeLast()
>> }
>>
>> Having this method throw would allow to change the above to:
>> try collection.removeLast()
>>
>> – Louis D'hauwe
>>
>>> On 17 Oct 2016, at 22:52, Max Moiseev <mois...@apple.com
>>> <mailto:mois...@apple.com>> wrote:
>>>
>>> You can use popLast, that does exactly that:
>>> https://github.com/apple/swift/blob/master/stdlib/public/core/BidirectionalCollection.swift#L213
>>>
>>> <https://github.com/apple/swift/blob/master/stdlib/public/core/BidirectionalCollection.swift#L213>
>>>
>>> Max
>>>
>>>> On Oct 17, 2016, at 1:14 PM, Louis D'hauwe via swift-evolution
>>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>>>>
>>>> Regarding the removeLast() function on Collection:
>>>>
>>>> The current implementation
>>>> <https://github.com/apple/swift/blob/c3b7709a7c4789f1ad7249d357f69509fb8be731/stdlib/public/core/BidirectionalCollection.swift#L228>
>>>> is:
>>>> @discardableResult
>>>> public mutating func removeLast() -> Iterator.Element {
>>>> let element = last!
>>>> self = self[startIndex..<index(before: endIndex)]
>>>> return element
>>>> }
>>>>
>>>> This makes it so that if you call removeLast() on an empty collection you
>>>> get a fatal error.
>>>> ("fatal error: can't remove last element from an empty collection")
>>>>
>>>> The documentation for removeLast()
>>>> <https://github.com/apple/swift/blob/c3b7709a7c4789f1ad7249d357f69509fb8be731/stdlib/public/core/BidirectionalCollection.swift#L220>
>>>> even has this noted:
>>>> "The collection must not be empty.".
>>>>
>>>> Surely you could just remove the explicit unwrapping of 'last' and add a
>>>> guard statement?
>>>>
>>>> As such:
>>>> @discardableResult
>>>> public mutating func removeLast() -> Iterator.Element? {
>>>> guard let element = last else {
>>>> return nil
>>>> }
>>>> self = self[startIndex..<index(before: endIndex)]
>>>> return element
>>>> }
>>>>
>>>> It sure seems more "Swifty" to alert at compile time that removing the
>>>> last item of a collection might fail, and make it return nil as a result.
>>>>
>>>> – Louis D'hauwe
>>>>
>>>> _______________________________________________
>>>> swift-evolution mailing list
>>>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>>
>>
>