---
title: BidirectionalCollection
framework: swift
role: symbol
role_heading: Protocol
path: swift/bidirectionalcollection
---

# BidirectionalCollection

A collection that supports backward as well as forward traversal.

## Declaration

```swift
protocol BidirectionalCollection<Element> : Collection where Self.Indices : BidirectionalCollection, Self.SubSequence : BidirectionalCollection
```

## Overview

Overview Bidirectional collections offer traversal backward from any valid index, not including a collection’s startIndex. Bidirectional collections can therefore offer additional operations, such as a last property that provides efficient access to the last element and a reversed() method that presents the elements in reverse order. In addition, bidirectional collections have more efficient implementations of some sequence and collection methods, such as suffix(_:). Conforming to the BidirectionalCollection Protocol To add BidirectionalProtocol conformance to your custom types, implement the index(before:) method in addition to the requirements of the Collection protocol. Indices that are moved forward and backward in a bidirectional collection move by the same amount in each direction. That is, for any valid index i into a bidirectional collection c: If i >= c.startIndex && i < c.endIndex, then c.index(before: c.index(after: i)) == i. If i > c.startIndex && i <= c.endIndex, then c.index(after: c.index(before: i)) == i. Valid indices are exactly those indices that are reachable from the collection’s startIndex by repeated applications of index(after:), up to, and including, the endIndex.

## Topics

### Associated Types

- [Element](swift/bidirectionalcollection/element.md)
- [Index](swift/bidirectionalcollection/index.md)
- [Indices](swift/bidirectionalcollection/indices-swift.associatedtype.md)
- [SubSequence](swift/bidirectionalcollection/subsequence.md)

### Instance Properties

- [endIndex](swift/bidirectionalcollection/endindex.md)
- [indices](swift/bidirectionalcollection/indices-4qv42.md)
- [last](swift/bidirectionalcollection/last.md)
- [startIndex](swift/bidirectionalcollection/startindex.md)

### Instance Methods

- [contains(_:)](swift/bidirectionalcollection/contains(_:)-1l08t.md)
- [contains(_:)](swift/bidirectionalcollection/contains(_:)-60wyq.md)
- [difference(from:)](swift/bidirectionalcollection/difference(from:).md)
- [difference(from:by:)](swift/bidirectionalcollection/difference(from:by:).md)
- [distance(from:to:)](swift/bidirectionalcollection/distance(from:to:).md)
- [dropLast(_:)](swift/bidirectionalcollection/droplast(_:).md)
- [firstMatch(of:)](swift/bidirectionalcollection/firstmatch(of:)-6v8ci.md)
- [firstMatch(of:)](swift/bidirectionalcollection/firstmatch(of:)-7m8f4.md)
- [firstRange(of:)](swift/bidirectionalcollection/firstrange(of:)-1di7b.md)
- [firstRange(of:)](swift/bidirectionalcollection/firstrange(of:)-3jqrg.md)
- [firstRange(of:)](swift/bidirectionalcollection/firstrange(of:)-5sum7.md)
- [formIndex(after:)](swift/bidirectionalcollection/formindex(after:).md)
- [formIndex(before:)](swift/bidirectionalcollection/formindex(before:).md)
- [index(_:offsetBy:)](swift/bidirectionalcollection/index(_:offsetby:).md)
- [index(_:offsetBy:limitedBy:)](swift/bidirectionalcollection/index(_:offsetby:limitedby:).md)
- [index(after:)](swift/bidirectionalcollection/index(after:).md)
- [index(before:)](swift/bidirectionalcollection/index(before:).md)
- [joined(separator:)](swift/bidirectionalcollection/joined(separator:).md)
- [last(where:)](swift/bidirectionalcollection/last(where:).md)
- [lastIndex(of:)](swift/bidirectionalcollection/lastindex(of:).md)
- [lastIndex(where:)](swift/bidirectionalcollection/lastindex(where:).md)
- [matches(of:)](swift/bidirectionalcollection/matches(of:)-5eey9.md)
- [matches(of:)](swift/bidirectionalcollection/matches(of:)-5hhx.md)
- [popLast()](swift/bidirectionalcollection/poplast().md)
- [prefixMatch(of:)](swift/bidirectionalcollection/prefixmatch(of:)-2fwv6.md)
- [prefixMatch(of:)](swift/bidirectionalcollection/prefixmatch(of:)-7dq6v.md)
- [ranges(of:)](swift/bidirectionalcollection/ranges(of:)-40wx3.md)
- [ranges(of:)](swift/bidirectionalcollection/ranges(of:)-9qfdo.md)
- [removeLast()](swift/bidirectionalcollection/removelast().md)
- [removeLast(_:)](swift/bidirectionalcollection/removelast(_:).md)
- [reversed()](swift/bidirectionalcollection/reversed().md)
- [split(maxSplits:omittingEmptySubsequences:separator:)](swift/bidirectionalcollection/split(maxsplits:omittingemptysubsequences:separator:).md)
- [split(separator:maxSplits:omittingEmptySubsequences:)](swift/bidirectionalcollection/split(separator:maxsplits:omittingemptysubsequences:).md)
- [starts(with:)](swift/bidirectionalcollection/starts(with:)-4972u.md)
- [starts(with:)](swift/bidirectionalcollection/starts(with:)-97xlm.md)
- [suffix(_:)](swift/bidirectionalcollection/suffix(_:).md)
- [trimmingPrefix(_:)](swift/bidirectionalcollection/trimmingprefix(_:)-1luge.md)
- [trimmingPrefix(_:)](swift/bidirectionalcollection/trimmingprefix(_:)-781ik.md)
- [wholeMatch(of:)](swift/bidirectionalcollection/wholematch(of:)-1wbp6.md)
- [wholeMatch(of:)](swift/bidirectionalcollection/wholematch(of:)-7741n.md)

### Subscripts

- [subscript(_:)](swift/bidirectionalcollection/subscript(_:)-5tj5.md)
- [subscript(_:)](swift/bidirectionalcollection/subscript(_:)-7tzd8.md)

## Relationships

### Inherits From

- [Collection](swift/collection.md)
- [Sequence](swift/sequence.md)

### Inherited By

- [RandomAccessCollection](swift/randomaccesscollection.md)
- [StringProtocol](swift/stringprotocol.md)

### Conforming Types

- [AnyBidirectionalCollection](swift/anybidirectionalcollection.md)
- [AnyRandomAccessCollection](swift/anyrandomaccesscollection.md)
- [AnyRegexOutput](swift/anyregexoutput.md)
- [Array](swift/array.md)
- [ArraySlice](swift/arrayslice.md)
- [ClosedRange](swift/closedrange.md)
- [CollectionOfOne](swift/collectionofone.md)
- [ContiguousArray](swift/contiguousarray.md)
- [DefaultIndices](swift/defaultindices.md)
- [DiscontiguousSlice](swift/discontiguousslice.md)
- [EmptyCollection](swift/emptycollection.md)
- [EnumeratedSequence](swift/enumeratedsequence.md)
- [FlattenSequence](swift/flattensequence.md)
- [Int.Words](swift/int/words-swift.struct.md)
- [Int16.Words](swift/int16/words-swift.struct.md)
- [Int32.Words](swift/int32/words-swift.struct.md)
- [Int64.Words](swift/int64/words-swift.struct.md)
- [Int8.Words](swift/int8/words-swift.struct.md)
- [KeyValuePairs](swift/keyvaluepairs.md)
- [LazyDropWhileSequence](swift/lazydropwhilesequence.md)
- [LazyFilterSequence](swift/lazyfiltersequence.md)
- [LazyMapSequence](swift/lazymapsequence.md)
- [LazyPrefixWhileSequence](swift/lazyprefixwhilesequence.md)
- [LazySequence](swift/lazysequence.md)
- [Range](swift/range.md)
- [RangeSet.Ranges](swift/rangeset/ranges-swift.struct.md)
- [Repeated](swift/repeated.md)
- [ReversedCollection](swift/reversedcollection.md)
- [Slice](swift/slice.md)
- [String](swift/string.md)
- [String.UTF16View](swift/string/utf16view.md)
- [String.UTF8View](swift/string/utf8view.md)
- [String.UnicodeScalarView](swift/string/unicodescalarview.md)
- [Substring](swift/substring.md)
- [Substring.UTF16View](swift/substring/utf16view.md)
- [Substring.UTF8View](swift/substring/utf8view.md)
- [Substring.UnicodeScalarView](swift/substring/unicodescalarview.md)
- [UInt.Words](swift/uint/words-swift.struct.md)
- [UInt128.Words](swift/uint128/words-swift.struct.md)
- [UInt16.Words](swift/uint16/words-swift.struct.md)
- [UInt32.Words](swift/uint32/words-swift.struct.md)
- [UInt64.Words](swift/uint64/words-swift.struct.md)
- [UInt8.Words](swift/uint8/words-swift.struct.md)
- [Unicode.Scalar.UTF16View](swift/unicode/scalar/utf16view.md)
- [Unicode.Scalar.UTF8View](swift/unicode/scalar/utf8view.md)
- [UnsafeBufferPointer](swift/unsafebufferpointer.md)
- [UnsafeMutableBufferPointer](swift/unsafemutablebufferpointer.md)
- [UnsafeMutableRawBufferPointer](swift/unsafemutablerawbufferpointer.md)
- [UnsafeRawBufferPointer](swift/unsaferawbufferpointer.md)

## See Also

### Collection Traversal

- [RandomAccessCollection](swift/randomaccesscollection.md)
