Доступ к 2D-массиву с диапазоном в Swift

#swift

#swift

Вопрос:

Когда я создаю 2D-массив следующим образом и применяю flatMap к нему диапазон, я получаю следующий результат:

 var a = [["5", "3", ".", ".", "7", "."],["6",".",".","1","9","5"]]
print(a.flatMap{$0[1..<5]})
  

вывод:

["3", ".", ".", "7", ".", ".", "1", "9"]

Но если я хочу просто отобразить диапазон следующим образом, я получаю следующую ошибку.

 print(a[1..<5])
  

Завершается сигналом 4

Комментарии:

1. И в чем вопрос?

2. Интересно, почему я получаю сбой?

3. Это потому, что это не имеет смысла. У вас есть только два массива строк, включенных в a.

4. Было бы разумнее, если бы вы написали что-то вроде[0][1..<5].

5. да, вы получаете ошибку. у вас есть 2 элемента в вашем корневом массиве, поэтому вы не можете print(a[1..<5]) , потому что элемента недостаточно.

Ответ №1:

Сбой — это именно то, чего следовало ожидать. a содержит всего два элемента, проиндексированных как 0 и 1. Применение большего индекса путем указания a[1..<5] (запрашивая также элементы 2, 3 и 4) выводит вас за пределы диапазона.

Ответ №2:

Если вы думаете об элементах в диапазоне как о столбцах 2D-массива, то вы могли бы получить их таким образом:

 let a = [["5", "3", ".", ".", "7", "."],
         ["6", ".", ".", "1", "9", "5"]]

func getColumns<T>(in range: Range<Int>, from array2d: [[T]]) -> [T] {
    return array2d.flatMap { $0[range] }
}

getColumns(in: 1..<5, from: a)  //["3", ".", ".", "7", ".", ".", "1", "9"]
  

Имейте в виду, что это все равно может привести к ошибке Index out of range, как и в случае с любым другим массивом.

Комментарии:

1. Что случилось с вашим вопросом в CR?

2. Я понял из вашего вопроса, что я мог бы вернуть его обратно. И это снова. Спасибо за заботу!

3. Этот код не выполняет то, что было задано в этом вопросе. Операционная система хочет получить ["3", ".", ".", "7", ".", ".", "1", "9"] от 1..<5 . Такое ощущение, что вы ответили на другой вопрос.

4. @Rob вот так, мой ответ сел на диету