Использование массивов массивов в Swift - PullRequest
0 голосов
/ 22 мая 2018

Все еще довольно плохо знаком со Swift. Я хочу использовать массив массивов целых чисел.Таким образом, я пишу следующее в функции, которая использует его:

var allSetsOfCards: [[Int]]

Я не знаю, прежде чем приложение запустится, что именно будет в нем или насколько оно будет большим, за исключением того, что каждый массив вон будет содержать три целых числа, поэтому я не могу точно указать, как он будет выглядеть, когда я его представлю.Позже я хочу добавить к нему некоторую информацию следующим образом:

allSetsOfCards[setNumber][0] = i
allSetsOfCards[setNumber][1] = j
allSetsOfCards[setNumber][2] = k

, где setNumber, i, j и k - целочисленные переменные.Это дает мне сообщение об ошибке:

Переменная 'allSetsOfCards' передается по ссылке перед инициализацией.

Что мне нужно сделать?Я искал этот сайт и нашел одну запись, которая, казалось, охватывала эту тему ( Двумерный массив в Swift ), но я не смог ее понять.Кажется, что никакое прибегание к помощи не работает.Ответ на мою конкретную проблему был бы великолепен.Краткое простое для понимания объяснение того, как быстрая обработка массивов была бы потрясающей.

Ответы [ 3 ]

0 голосов
/ 22 мая 2018

Хотя ваш вопрос может быть дубликатом: Переменная p, переданная по ссылке перед инициализацией , я постараюсь опубликовать описательный ответ на ваш случай.

То, что вы сделали до сих пор, реализовав:

var allSetsOfCards: [[Int]]

- это просто объявление переменной без инициализация it .Итак, что вам нужно сделать, это инициализировать его перед использованием, у вас будет несколько вариантов сделать это, вы можете просто сделать это так:

var allSetsOfCards = [[Int]]()

Это было бы хорошо, если вы уверены, чточто allSetsOfCards будет использоваться всегда.

Иногда вашему приложению не нужно будет работать с ним, например, представьте, что вам нужно будет заполнить allSetsOfCards, если только определенные условия имеют / имеютесли его применить, то его инициализация будет бессмысленной (это бесполезная трата памяти), в этот момент вы можете объявить ее как ленивое свойство :

lazy var allSetsOfCards = [[Int]]()

при условии, что allSetsOfCards является свойством структуры или класса, в этот момент оно не будет инициализировано, если вам не нужно его использовать.


Примечание:

Кроме того, вы должны убедиться, что внутренние массивы также уже инициализированы, например:

var allSetsOfCards = [[Int]]()

// that's what I mean:
var firstSet = [Int]()

allSetsOfCards.append(firstSet)

// assuming that `setNumber` is 0 so far...
var setNumber = 0

allSetsOfCards[setNumber].append(i)
allSetsOfCards[setNumber].append(j)
allSetsOfCards[setNumber].append(k)

// OR (as shorter option):
allSetsOfCards[setNumber].append([i, j, k])

Знаете ли вы, Swift делает имеет Наборы ?Возможно, вы захотите вместо allSetsOfCards быть массивом множеств ([Set<Int>]()) instead.

0 голосов
/ 22 мая 2018

Попробуйте это ...

вы можете инициализировать массив массива следующим образом

var intArrayOfArray: [[Int]] = [[Int]]()

ниже строки будет выбрасыватьошибка, поскольку в этот момент массив только инициализируется и не содержит никаких элементов, следовательно, индекс массива выходит за пределы связанной ошибки.

 //print(intArrayOfArray[0]) //output:: error indexOutOfBound

intArrayOfArray.append([1,2,3]) 

print(intArrayOfArray[0]) // output:: [1,2,3]

intArrayOfArray.append([4,5])

print(intArrayOfArray[1]) // [4,5]

intArrayOfArray[0] = [6, 7]

print(intArrayOfArray[0]) // [6, 7]
0 голосов
/ 22 мая 2018

Сообщение об ошибке довольно ясно.То, что вы сделали здесь, это просто декларация.Чтобы использовать его, вам нужно инициализировать его отдельно от объявления:

var allSetsOfCards: [[Int]]
allSetsOfCards = [[Int]]()

или вместе с ним:

var allSetsOfCards = [[Int]]()

Следующая проблема возникнет, когда компилятор достигнет вашего индекса.Поскольку массив в начале довольно пустой, вы получите ошибку Index out of range.Вы должны либо зарезервировать емкость, чтобы иметь возможность индексировать ваши индексы, либо добавлять свои элементы в пустой массив.

allSetsOfCard.append([i, j, k])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...