Я так запутался в 2D-массивах в Swift. Опишу шаг за шагом. И не могли бы вы поправить меня, если я ошибаюсь.
Прежде всего; объявление пустого массива:
class test{
var my2Darr = Int[][]()
}
Во-вторых заполните массив. (например, my2Darr[i][j] = 0
где i, j - переменные цикла)
class test {
var my2Darr = Int[][]()
init() {
for(var i:Int=0;i<10;i++) {
for(var j:Int=0;j<10;j++) {
my2Darr[i][j]=18 /* Is this correct? */
}
}
}
}
И, наконец, редактирование элемента в массиве
class test {
var my2Darr = Int[][]()
init() {
.... //same as up code
}
func edit(number:Int,index:Int){
my2Darr[index][index] = number
// Is this correct? and What if index is bigger
// than i or j... Can we control that like
if (my2Darr[i][j] == nil) { ... } */
}
}
var my2DArray = Array(count: 10, repeatedValue: Array(count: 10, repeatedValue: 18))
И вам действительно следует перейти на более новую бета-версию.Int[][]()
больше не является допустимым синтаксисом. Он был изменен на[[Int]]()
.Ответы:
Определить изменяемый массив
ИЛИ:
ИЛИ, если вам нужен массив предопределенного размера (как указано @ 0x7fffffff в комментариях):
Изменить элемент в позиции
ИЛИ
Изменить подмассив
ИЛИ
ИЛИ
Если до этих изменений у вас был массив 3x2 из 0 (нулей), теперь у вас есть:
Так что имейте в виду, что подмассивы являются изменяемыми, и вы можете переопределить исходный массив, представляющий матрицу.
Изучите размер / границы перед доступом
Примечания: одинаковые правила разметки для трехмерных и N-мерных массивов.
источник
arr
определили, как в ответе, тогдаmyVar
должно быть Int, не так ли?var arr = Int(repeating: Int(repeating: 0, count: 2), count: 3)
var arr = Array(count: 2, repeatedValue: Array(count: 3, repeatedValue: 0))
Из документов:
Вы можете создавать многомерные массивы, вставляя пары квадратных скобок, где имя базового типа элементов содержится в самой внутренней паре квадратных скобок. Например, вы можете создать трехмерный массив целых чисел, используя три набора квадратных скобок:
При доступе к элементам в многомерном массиве крайний левый индекс индекса относится к элементу по этому индексу во внешнем массиве. Следующий индекс нижнего индекса справа относится к элементу этого индекса в массиве, вложенном на один уровень. И так далее. Это означает, что в приведенном выше примере array3D [0] относится к [[1, 2], [3, 4]], array3D [0] [1] относится к [3, 4], а array3D [0] [1 ] [1] относится к значению 4.
источник
Сделайте это обычным Swift 4
источник
Вы должны быть осторожны при использовании
Array(repeating: Array(repeating: {value}, count: 80), count: 24)
.Если значением является объект, который инициализируется
MyClass()
, то они будут использовать ту же ссылку.Array(repeating: Array(repeating: MyClass(), count: 80), count: 24)
не создает новый экземплярMyClass
в каждом элементе массива. Этот метод создает толькоMyClass
один раз и помещает его в массив.Вот безопасный способ инициализировать многомерный массив.
источник
Array(repeating: {value}, could 80)
скобками{value}
? Это создало бы массив закрытий, не так ли?{value}
мета-нотация для «некоторого значения типа AnyObject» (ссылочный тип)?В Swift 4
источник
Согласно документам Apple для swift 4.1, вы можете легко использовать эту структуру для создания 2D-массива:
Ссылка: https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Subscripts.html
Пример кода:
источник
Array(repeating:count:)
. См. Комментарий, который я опубликовал к вашему другому ответу.Прежде чем использовать многомерные массивы в Swift, рассмотрите их влияние на производительность . В моих тестах сглаженный массив работал почти в 2 раза лучше, чем 2D-версия:
Среднее время выполнения для заполнения массива 50x50: 82,9 мс
vs.
Среднее время выполнения для заполнения 2D-массива 50x50: 135 мс
Оба алгоритма имеют размер O (n ^ 2), поэтому разница во времени выполнения вызвана тем, как мы инициализируем таблицу.
Наконец, худшее, что вы можете сделать, - это использовать
append()
для добавления новых элементов. В моих тестах это оказалось самым медленным:Среднее время выполнения для заполнения массива 50x50 с помощью append (): 2,59 с.
Вывод
Избегайте многомерных массивов и используйте доступ по индексу, если скорость выполнения имеет значение. Одномерные массивы более производительны, но ваш код может быть немного сложнее для понимания.
Вы можете запустить тесты производительности самостоятельно после загрузки демонстрационного проекта из моего репозитория GitHub: https://github.com/nyisztor/swift-algorithms/tree/master/big-o-src/Big-O.playground
источник
Это можно сделать одной простой строкой.
Swift 5
Вы также можете сопоставить его с экземплярами любого класса или структуры по вашему выбору.
источник