Если mat
является вложенным массивом, то mat.joined()
является «отложенной плоской коллекцией» всех вложенных элементов.Это предлагает решить проблему для произвольных коллекций:
Для данной коллекции и элемента этой коллекции вернуть непосредственного преемника элемента.Коллекция рассматривается как циклический, , так что преемником последнего элемента является первый элемент.
Прямая реализация (объяснения в строке):
extension Collection where Element: Comparable {
func cyclicNext(after elem: Element) -> Element? {
// Find (first) index of given element
guard var idx = firstIndex(of: elem) else {
return nil // Element not present in collection
}
formIndex(after: &idx) // Advance index by one
if idx == endIndex { // If past the end ...
idx = startIndex // ... then jump back to the start
}
return self[idx]
}
}
Если элемент встречается в коллекции более одного раза, возвращается преемник первого вхождения.
Это можно применить к вашей матрице:
let mat: [[Int]] = [[1, 0, 234, 345, 678],
[123, 456, 789],
[0, 9]]
print(mat.joined().cyclicNext(after: 1)) // 0
print(mat.joined().cyclicNext(after: 678)) // 123
print(mat.joined().cyclicNext(after: 123)) // 456
print(mat.joined().cyclicNext(after: 9)) // 1
print(mat.joined().cyclicNext(after: 999)) // nil
Можеттакже применимы к другим коллекциям:
print([1, 3, 5, 7].cyclicNext(after: 3)) // 5
print([1, 3, 5, 7].cyclicNext(after: 7)) // 1
print("Hello World".cyclicNext(after: "W")) // "o"
print("Hello World".cyclicNext(after: "d")) // "H"