Swift 3.1 has solved this problem with `drop(while:)` and `prefix(while:)` struct Person { let isMale: Bool let name: String } let people = [Person(isMale: true, name: "Bill"), Person(isMale: false, name: "Jane"), Person(isMale: true, name: "José"), Person(isMale: false, name: "Sarah"), Person(isMale: true, name: "Steve"), Person(isMale: true, name: "Tony")] func trimMen(people: [Person]) -> [Person] { let removedPrefixMen = people.drop { $0.isMale } let removedSuffixMen = removedPrefixMen.reversed().drop { $0.isMale } return removedSuffixMen.reversed() } // [{isMale false, name "Jane"}, {isMale true, name "José"}, {isMale false, name "Sarah"}] Also in Swift 3.1, concrete constrained extensions, means I can do this… extension Array where Element == Person { func trimMen() -> [Element] { let removedPrefixMen = drop{ $0.isMale } let removedSuffixMen = removedPrefixMen.reversed().drop{ $0.isMale } return removedSuffixMen.reversed() } } people.trimMen()