[swift-evolution] Why doesn't removeLast() on Collection return an optional?

Louis D'hauwe louisdhauwe at silverfox.be
Mon Oct 17 15:14:59 CDT 2016

Regarding the removeLast() function on Collection:

The current implementation <https://github.com/apple/swift/blob/c3b7709a7c4789f1ad7249d357f69509fb8be731/stdlib/public/core/BidirectionalCollection.swift#L228> is:
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:
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

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20161017/fdaa2a65/attachment.html>

More information about the swift-evolution mailing list