Quero passar meu Swift Array
account.chats
para chatsViewController.chats
referência (para que, quando eu adicionar um bate-papo account.chats
, chatsViewController.chats
ainda aponte para account.chats
). Ou seja, não quero que o Swift separe as duas matrizes quando a duração das account.chats
alterações for alterada.
arrays
swift
pass-by-reference
ma11hew28
fonte
fonte
account
uma variável global e definir achats
propriedade deChatsViewController
como:var chats: [Chat] { return account.chats }
.Respostas:
As estruturas no Swift são passadas por valor, mas você pode usar o
inout
modificador para modificar sua matriz (veja as respostas abaixo). As aulas são passadas por referência.Array
eDictionary
no Swift são implementados como estruturas.fonte
NSArray
porqueNSArray
e o array Swift tem diferenças semânticas sutis (como o tipo de referência), e isso possivelmente leva a mais erros.inout
com Structs?Para o operador de parâmetro de função, usamos:
let (é o operador padrão, portanto, podemos omitir let ) para tornar um parâmetro constante (significa que não podemos modificar nem mesmo a cópia local);
var para torná-lo variável (podemos modificá-lo localmente, mas isso não afetará a variável externa que foi passada para a função); e
inout para torná-lo um parâmetro in-out. Na entrada significa na verdade passar variável por referência, não por valor. E requer não apenas aceitar valor por referência, mas também passá-lo por referência; assim, passe-o com & - em
foo(&myVar)
vez de apenasfoo(myVar)
Então faça assim:
Para ser exato, não é apenas uma referência, mas um alias real para a variável externa; portanto, você pode fazer esse truque com qualquer tipo de variável, por exemplo, com número inteiro (você pode atribuir um novo valor a ela), embora possa não ser um boa prática e pode ser confuso modificar os tipos de dados primitivos como este.
fonte
inout
posição mudou, iefunc addItem(localArr: inout [Int])
var
não está mais disponível para o atributo de parâmetro da função.Defina você mesmo
BoxedArray<T>
que implementa aArray
interface, mas delega todas as funções para uma propriedade armazenada. Assim sendoUse o local
BoxedArray
em que você usaria umArray
. A atribuição de aBoxedArray
será por referência, é uma classe e, portanto, as alterações na propriedade armazenada, através daArray
interface, serão visíveis para todas as referências.fonte
String
é um subtipo doAny
MAS se vocêimport Foundation
, em seguida,String
torna-se um subtipo deAnyObject
.Para as versões Swift 3-4 (XCode 8-9), use
fonte
Algo como
???
fonte
func test(b: inout [Int])
... talvez essa seja uma sintaxe antiga; Eu só entrei no Swift em 2016 e essa resposta é de 2014, então talvez as coisas fossem diferentes?Uma outra opção é fazer com que o consumidor da matriz peça ao proprietário conforme necessário. Por exemplo, algo como:
Você pode modificar a matriz o quanto quiser dentro da classe Account. Observe que isso não ajuda se você também deseja modificar a matriz da classe do controlador de exibição.
fonte
Usar
inout
é uma solução, mas não me parece muito rápida, pois matrizes são tipos de valor. Estilisticamente, eu pessoalmente prefiro retornar uma cópia mutada:fonte
inout
é universalmente melhor porque economiza bateria. Para o qual eu diria que a legibilidade, a imutabilidade e a segurança de threads desta solução são universalmente melhores e que o inout deve ser usado apenas como uma otimização nos raros casos em que o caso de uso o justifica.use a
NSMutableArray
ou aNSArray
, que são classesDessa forma, você não precisa implantar nenhum raspador e pode usar a construção em ponte
fonte