Maintenant que les tableaux de Swift sont vraiment immuables grâce à la sémantique de la valeur, comment puis-je créer une copie mutable d'un tableau immuable? Semblable à Obj-C mutableCopy()
. Je peux bien sûr convertir le tableau en un tableau NSArray et utiliser mutableCopy()
mais je ne souhaite pas utiliser NSArray car il n'est pas strictement typé.
J'ai une toolbar
qui a items
du storyboard. Je souhaite supprimer un élément de la barre d'outils et utiliser toolbar.setItems
. Je voulais le faire sans transtyper en tant que NSArray
, car aucune de ces fonctions ne prend NSArrays
, elles prennent [AnyObject]
.
Évidemment, maintenant, lorsque j'appelle removeAtIndex()
, cela ne fonctionne pas, ce qui est correct. J'ai juste besoin d'une mutableCopy
Attribuer simplement à var ne fonctionne pas pour moi et donne 'Immutable value of type [AnyObject]
'
var toolbarItems = self.toolbar.items
toolbarItems.removeAtIndex(2) //Immutable value of type [AnyObject]
J'utilise Beta 3
Le problème est que self.toolbar.items
est un optionnel implicitement non enveloppé (de type [AnyObject]!) Et qu'ils sont toujours immuables. Lorsque vous affectez à la variable toolbarItems
sans indiquer explicitement son type, elle devient également une option implicitement non enveloppée et est donc immuable.
Pour résoudre ce problème, faites soit:
var toolbarItems:[AnyObject] = self.toolbar.items
toolbarItems.removeAtIndex(2)
Ou:
var toolbarItems = self.toolbar.items as [AnyObject]
toolbarItems.removeAtIndex(2)
Mettre à jour
À partir de la version bêta 5 de Xcode 6, vous pouvez mettre à jour les collections stockées dans des variables facultatives. Le code d'origine fonctionne donc désormais:
var toolbarItems = self.toolbar.items
toolbarItems.removeAtIndex(2)
Les tableaux sont des types de valeur (struct), ils sont donc transmis par valeur et non par référence.
Cela dit, si vous créez une variable de type tableau et que vous lui affectez le tableau immuable, une copie du tableau immuable est en fait créée et affectée - et bien sûr, cette copie n’a aucune relation avec le tableau immuable d'origine (à part le même valeurs au moment de sa création).
let immutable = [1, 2, 3]
//immutable[0] = 1 // Fails, ok
var mutable = immutable
mutable[0] = 5
Dans votre cas, vous accédez à un tableau immuable qui est une NSArray
de AnyObject
s (voir documentation ). Vous pouvez l’utiliser comme tableau dans Swift, en faire une copie et le modifier comme suit:
let immutable : NSArray = [ 1, 2, 3 ]
//immutable[0] = 1 // Fails, ok
var mutable : [AnyObject] = immutable
mutable.removeAtIndex(1) // mutable now is [1, 3]
mutable[0] = 7 // mutable now is [7, 3]
Une fois vos modifications terminées, vous pouvez affecter la propriété items
.
Testé + fonctionne:
var mutable : [UIBarButtonItem] = []
for button in toolbar.items {
mutable += button as UIBarButtonItem
}
mutable.removeAtIndex(2)
toolbar.setItems(mutable, animated: true)
POUR RETIRER UN OBJET DE L'INDICE PARTICULIER D'UN RÉSEAU.
let fullArray : NSArray = Userdefaults().value(forKey: "YOUR_ARRAY_STRING") as! NSArray
var mutableArray : [AnyObject] = fullArray as [AnyObject]
mutableArray.remove(at: INDEX_TO_REMOVE) //Eg: mutableArray.remove(at: 0)
mutableArray.append(ARRAY_TO_APPEND)
C'est aussi simple que de déclarer une var
avec votre tableau.
var items = toolbar.items
Vous pouvez maintenant modifier les éléments, puis les réaffecter à la barre d’outils.
toolbar.items = items
Notez que vous pouvez ne peut pas (à partir de Beta 3) modifier les éléments d’un tableau "immuable" déclaré avec let
. Juste la longueur du tableau est a été corrigé, ce qui explique pourquoi vous ne pouvez pas supprimer d’éléments.
Cependant, selon la documentation d'Apple sur UIToolbar
, le tableau items
est déjà mutable.
Rapide
var items: [AnyObject]!
Dans Beta3, les tableaux de constantes sont complètement immuables tandis que les tableaux de variables sont entièrement mutables. Donc, changez simplement let array: en var array: et ensuite vérifiez votre code