Eu fico tão confuso sobre arrays 2D no Swift. Deixe-me descrever passo a passo. E você poderia me corrigir se eu estiver errado.
Em primeiro lugar; declaração de uma matriz vazia:
class test{
var my2Darr = Int[][]()
}
Em segundo lugar, preencha a matriz. (como my2Darr[i][j] = 0
onde i, j são variáveis for-loop)
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? */
}
}
}
}
E por último, Editando o elemento da matriz
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))
E você realmente deve atualizar para uma versão beta mais recente.Int[][]()
não é mais sintaxe válida. Foi alterado para[[Int]]()
.Respostas:
Definir matriz mutável
OU:
OU se você precisar de uma matriz de tamanho predefinido (conforme mencionado por @ 0x7fffffff nos comentários):
Mudar elemento na posição
OU
Alterar submatriz
OU
OU
Se você tinha uma matriz 3x2 de 0 (zeros) antes dessas mudanças, agora você tem:
Portanto, esteja ciente de que as submatrizes são mutáveis e você pode redefinir a matriz inicial que representa a matriz.
Examine o tamanho / limites antes de acessar
Observações: Mesmas regras de marcação para matrizes 3 e N dimensionais.
fonte
arr
definiu como na resposta, entãomyVar
deveria ser Int, não é?var arr = Int(repeating: Int(repeating: 0, count: 2), count: 3)
var arr = Array(count: 2, repeatedValue: Array(count: 3, repeatedValue: 0))
Dos documentos:
Você pode criar matrizes multidimensionais aninhando pares de colchetes, onde o nome do tipo básico dos elementos está contido no par mais interno de colchetes. Por exemplo, você pode criar uma matriz tridimensional de inteiros usando três conjuntos de colchetes:
Ao acessar os elementos em uma matriz multidimensional, o índice subscrito mais à esquerda se refere ao elemento naquele índice na matriz mais externa. O próximo índice subscrito à direita se refere ao elemento nesse índice na matriz que está aninhado em um nível. E assim por diante. Isso significa que no exemplo acima, array3D [0] se refere a [[1, 2], [3, 4]], array3D [0] [1] se refere a [3, 4] e array3D [0] [1 ] [1] refere-se ao valor 4.
fonte
Torne-o Genérico Swift 4
fonte
Você deve ter cuidado ao usar
Array(repeating: Array(repeating: {value}, count: 80), count: 24)
.Se o valor for um objeto, que é inicializado por
MyClass()
, eles usarão a mesma referência.Array(repeating: Array(repeating: MyClass(), count: 80), count: 24)
não cria uma nova instância deMyClass
em cada elemento da matriz. Este método cria apenasMyClass
uma vez e o coloca na matriz.Esta é uma maneira segura de inicializar um array multidimensional.
fonte
Array(repeating: {value}, could 80)
com colchetes{value}
? Isso criaria uma série de fechamentos, não é?{value}
meta-notação para "algum valor do tipo AnyObject" (um tipo de referência)?Em Swift 4
fonte
De acordo com os documentos da Apple para o Swift 4.1, você pode usar essa estrutura facilmente para criar um array 2D:
Link: https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Subscripts.html
Amostra de código:
fonte
Array(repeating:count:)
. Veja o comentário que postei na sua outra resposta.Antes de usar arrays multidimensionais em Swift, considere seu impacto no desempenho . Em meus testes, o array achatado teve um desempenho quase 2x melhor do que a versão 2D:
Tempo médio de execução para preencher um array 50x50: 82,9ms
vs.
Tempo médio de execução para preencher um array 2D 50x50: 135ms
Ambos os algoritmos são O (n ^ 2), então a diferença nos tempos de execução é causada pela maneira como inicializamos a tabela.
Finalmente, o pior que você pode fazer é
append()
adicionar novos elementos. Isso provou ser o mais lento em meus testes:Tempo médio de execução para preencher uma matriz 50x50 usando append (): 2,59s
Conclusão
Evite arrays multidimensionais e use o acesso por índice se a velocidade de execução for importante. Os arrays 1D têm melhor desempenho, mas seu código pode ser um pouco mais difícil de entender.
Você mesmo pode executar os testes de desempenho após baixar o projeto de demonstração do meu repositório GitHub: https://github.com/nyisztor/swift-algorithms/tree/master/big-o-src/Big-O.playground
fonte
Isso pode ser feito em uma linha simples.
Swift 5
Você também pode mapeá-lo para instâncias de qualquer classe ou estrutura de sua escolha
fonte