web-dev-qa-db-fra.com

Comment créer une copie mutable d'un tableau immuable en swift?

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

14
Johnston

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)
19
vacawama

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 AnyObjects (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.

13
Antonio

Testé + fonctionne: 

    var mutable : [UIBarButtonItem] = []
    for button in toolbar.items {
        mutable += button as UIBarButtonItem
    }
    mutable.removeAtIndex(2)
    toolbar.setItems(mutable, animated: true)
1
Mundi

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)
1
Ram Madhavan

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]!

1
Mundi

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

0
Hussain Shabbir