Начнем с того, что вы можете написать аккуратное расширение, чтобы вывести диагональ из вложенного массива:
extension Array {
func diagonal<T>(order: Int) -> [T] where Element == [T] {
var order = order
return self.compactMap {
guard order >= 0, $0.count > order else {
order -= 1
return nil
}
let output = $0[order]
order -= 1
return output
}
}
}
let array = [[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]
print(array.diagonal(order: 0)) // [1]
print(array.diagonal(order: 1)) // [2, 4]
print(array.diagonal(order: 2)) // [3, 5 ,7]
print(array.diagonal(order: 3)) // [6, 8]
Это просто случай болтового стандартного сокращения и суммы:
let fristDiagonal = array.diagonal(order: 0).reduce(0, +)
let secondDiagonal = array.diagonal(order: 1).reduce(0, +)