Je veux passer mon Swift Array
account.chats
à chatsViewController.chats
par référence (de sorte que lorsque j'ajoute une discussion à account.chats
, chatsViewController.chats
pointe toujours vers account.chats
). Ie, je ne veux pas que Swift sépare les deux tableaux lorsque la longueur des account.chats
changements.
arrays
swift
pass-by-reference
ma11hew28
la source
la source
account
une variable globale et la définition de lachats
propriétéChatsViewController
comme:var chats: [Chat] { return account.chats }
.Réponses:
Les structures dans Swift sont passées par valeur, mais vous pouvez utiliser le
inout
modificateur pour modifier votre tableau (voir les réponses ci-dessous). Les classes sont passées par référence.Array
etDictionary
dans Swift sont implémentés en tant que structures.la source
NSArray
parce queNSArray
et le tableau Swift ont des différences sémantiques subtiles (telles que le type de référence), ce qui peut vous conduire à plus de bogues.inout
avec Structs?Pour l'opérateur de paramètre de fonction, nous utilisons:
let (c'est l'opérateur par défaut, nous pouvons donc omettre let ) pour rendre un paramètre constant (cela signifie que nous ne pouvons même pas modifier la copie locale);
var pour le rendre variable (nous pouvons le modifier localement, mais cela n'affectera pas la variable externe qui a été passée à la fonction); et
inout pour en faire un paramètre in-out. In-out signifie en fait passer la variable par référence et non par valeur. Et il faut non seulement accepter la valeur par référence, mais aussi la passer par référence, alors passez-la avec & -
foo(&myVar)
au lieu de simplementfoo(myVar)
Alors faites-le comme ceci:
Pour être exact, ce n'est pas seulement une référence, mais un véritable alias pour la variable externe, vous pouvez donc faire une telle astuce avec n'importe quel type de variable, par exemple avec un entier (vous pouvez lui attribuer une nouvelle valeur), bien que ce ne soit pas un bonne pratique et il peut être déroutant de modifier les types de données primitifs comme celui-ci.
la source
inout
position a changé, c'estfunc addItem(localArr: inout [Int])
var
n'est plus disponible pour l'attribut de paramètre de fonction.Définissez vous-même un
BoxedArray<T>
qui implémente l'Array
interface mais délègue toutes les fonctions à une propriété stockée. En tant que telUtilisez le
BoxedArray
partout où vous utiliseriez unArray
. L'attribution d'unBoxedArray
testament se fait par référence, c'est une classe, et donc les modifications apportées à la propriété stockée, via l'Array
interface, seront visibles par toutes les références.la source
String
est un sous-type deAny
MAIS si vous devenezimport Foundation
alorsString
un sous-type deAnyObject
.Pour les versions 3-4 de Swift (XCode 8-9), utilisez
la source
Quelque chose comme
???
la source
func test(b: inout [Int])
... peut-être que c'est une vieille syntaxe; Je ne suis entré dans Swift qu'en 2016 et cette réponse date de 2014, alors peut-être que les choses étaient différentes?Une autre option consiste à demander au consommateur de la baie de le demander au propriétaire si nécessaire. Par exemple, quelque chose du genre:
Vous pouvez ensuite modifier le tableau autant que vous le souhaitez dans la classe Account. Notez que cela ne vous aide pas si vous souhaitez également modifier le tableau à partir de la classe de contrôleur de vue.
la source
L'utilisation
inout
est une solution, mais cela ne me semble pas très rapide car les tableaux sont des types valeur. Stylistiquement, je préfère personnellement renvoyer une copie mutée:la source
inout
c'est universellement meilleur parce que cela permet d'économiser de la batterie. Ce à quoi je dirais que la lisibilité, l'immuabilité et la sécurité des threads de cette solution sont universellement meilleures et que inout ne devrait être utilisé comme optimisation que dans les rares cas où le cas d'utilisation le justifie.utiliser un
NSMutableArray
ou unNSArray
, qui sont des classesde cette façon, vous n'avez pas besoin d'implémenter de wraper et pouvez utiliser la construction en pontage
la source