Я использую Array of Array [[Int]] для хранения координат на карте. Я, например, хочу заменить все "2" на "1". Для этого я создал 2 цикла for, которые определяют пространство массива и проверяют содержимое. Это не очень гибко и работает только с массивами определенного размера.
private func remove2fromArray(currentArray: [[Int]]) -> [[Int]] {
var newArray : [[Int]] = currentArray
for section in 0...14 {
for row in 0...19 {
if newArray[section][row] == 2
{ newArray[section][row] = 1 }
}
}
return newArray
}
Есть ли способ просто просмотреть содержимое массива, чтобы заменить числа?
например currentArray.findAndReplace(find:2, replace: 1) или аналогичный, который работает с [[Int]]?
Почему вы используете 2d-массив для хранения координат? При чем тут модель? Не лучше ли было бы иметь структуру Coordinate
и просто хранить их плоский массив?
Массив — это «упорядоченная коллекция с произвольным доступом». Это не похоже на Координат для меня. Вам лучше создать тип данных, который лучше подходит для координаты.
Ну, это прекрасно работает, потому что я могу получить доступ к массиву [разделу] [строке], который определяет, на мой взгляд, двумерное пространство — координаты. Вы имеете в виду что-то вроде: struct {x:Int;y:Int;value:Int}? - на мой взгляд, это будет труднее накормить.
И было бы полезно, если бы вы могли объяснить, как заменить диапазоны закодированных карт, потому что я не мог использовать count для массива в массиве. Но я мог бы сделать это с помощью функции карты ниже.
Вы можете сделать это следующим образом:
let result = array.map { subarray in
subarray.map { integer -> Int in
if integer == 2 {
return 1
} else {
return integer
}
}
}
Еще короче:
let result = array.map {
$0.map { integer in
return integer == 2 ? 1 : integer
}
}
И однострочный:
let result = array.map { $0.map { $0 == 2 ? 1 : $0 } }
Я попытаюсь объяснить, что здесь происходит, простыми словами: карта делает то, что она проходит через элементы массива один за другим и применяет функцию к элементу.
В нашем примере первая карта перебирает элементы внешнего массива, поэтому $0
здесь относится к внутренним массивам (по одному).
Вторая карта перебирает элементы внутренних массивов. Итак, $0
во внутренней карте относится к каждому элементу элементов внутреннего массива.
работает как шарм. Думаю, мне придется прочитать руководство, что на самом деле делает .map, или вы могли бы объяснить отдельные параметры? map возвращает массив, индивидуальное содержимое которого представлено $0 и изменено последующими функциями. где я могу узнать о коротких функциях с "?" а также ":"? Это кажется таким худым.
Я обновил свой ответ, чтобы объяснить, что происходит. Если вам нужно больше объяснений, пожалуйста, дайте мне знать.
Идеально. Большое спасибо!
По крайней мере, удалите эти жестко запрограммированные диапазоны. Базируйте циклы на фактических размерах массивов.