¿Cómo se puede crear una copy mutable de una matriz inmutable en forma rápida?

Ahora que los arreglos de Swift son realmente inmutables gracias a la semántica de valor completo, ¿cómo puedo crear una copy mutable de una matriz inmutable? Similar a Obj-C mutableCopy() . Por supuesto, puedo descender la matriz a un NSArray y usar mutableCopy() pero no quiero usar NSArray porque no escribe estrictamente.

Tengo una toolbar que tiene items del guión gráfico. Quiero eliminar un elemento de la barra de herramientas y utilizar toolbar.setItems . Quería hacerlo sin lanzar como NSArray , porque ninguna de estas funciones toma NSArrays , toman [AnyObject] .

Obviamente ahora cuando llamo removeAtIndex() no funciona, lo cual es correcto. Solo necesito un mutableCopy

Simplemente asignar a var no funciona para mí y dar ' Immutable value of type [AnyObject] '

 var toolbarItems = self.toolbar.items toolbarItems.removeAtIndex(2) //Immutable value of type [AnyObject] 

Estoy usando Beta 3

El problema es que self.toolbar.items es un opcional implícitamente self.toolbar.items (de tipo [AnyObject]!) Y siempre son inmutables. Cuando asigna a la variable toolbarItems sin indicar explícitamente su tipo, también se convierte en un opcional implícitamente toolbarItems y, por lo tanto, también es inmutable.

Para solucionar esto, haga lo siguiente:

 var toolbarItems:[AnyObject] = self.toolbar.items toolbarItems.removeAtIndex(2) 

O:

 var toolbarItems = self.toolbar.items as [AnyObject] toolbarItems.removeAtIndex(2) 

Actualizar

A partir de Xcode 6 Beta 5, puede actualizar collections que se almacenan en variables opcionales, por lo que el código original ahora funciona:

 var toolbarItems = self.toolbar.items toolbarItems.removeAtIndex(2) 

Las matrices son types de valor (struct), por lo que se pasan por valor y no por reference.

Dicho esto, si crea una variable de tipo array y le asigna la matriz inmutable, en realidad se crea y se le asigna una copy de la matriz inmutable, y, por supuesto, esa copy no tiene ninguna relación con la matriz inmutable original (además de tener la misma valores en el momento en que se crea).

 let immutable = [1, 2, 3] //immutable[0] = 1 // Fails, ok var mutable = immutable mutable[0] = 5 

En su caso, está accediendo a una matriz inmutable que es un NSArray de AnyObject (ver documentation ). Puede usarlo como una matriz en swift, hacer una copy de ella y modificar de la siguiente manera:

 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] 

Una vez que haya terminado con sus cambios, puede asignar a la propiedad de items

Es tan simple como declarar una var con su matriz.

 var items = toolbar.items 

Ahora puede cambiar elementos y luego volver a asignarlos a la barra de herramientas.

 toolbar.items = items 

Tenga en count que no puede (a partir de Beta 3) alterar los elementos de una matriz "inmutable" declarada con let también. Solo se arregló la longitud de la matriz, por lo que no puede eliminar elementos.

Sin embargo, de acuerdo con la documentation de Apple de UIToolbar , la matriz de items ya es mutable.

RÁPIDO
var items: [AnyObject]!

Probado + funciona:

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

En Beta3, las matrices constantes son completamente inmutables, mientras que las matrices variables son completamente mutables. Entonces, simplemente cambie let array: to var array: y luego verifique su código

PARA RETIRAR UN OBJETO DE UN ÍNDICE PARTICULAR DE UN ARRAY.

 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)