如何在swift中创build一个不可变数组的可变副本?

既然Swift的数组是真正的不变的感谢完整价值的语义,我怎么能创build一个不可变数组的可变副本? 类似于Obj-C mutableCopy() 。 我当然可以倒阵数组到NSArray并使用mutableCopy()但不想使用NSArray,因为它没有严格键入。

我有一个toolbar ,有故事板中的items 。 我想从工具栏中删除一个项目,并使用toolbar.setItems 。 我想这样做,而不是作为一个NSArray投射,因为这些函数没有采取NSArrays ,他们采取[AnyObject]

显然现在当我调用removeAtIndex()它不起作用,这是正确的。 我只需要一个mutableCopy

简单地分配给var不适用于我,给予' Immutable value of type [AnyObject] '

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

我正在使用Beta 3

问题是, self.toolbar.items是一个隐式解包可选(的types[AnyObject]!),他们总是不变的。 当你将variablestoolbarItems分配给variablestoolbarItems而不显式地指明它的types时,它也变成了一个隐含的unwrapped可选项,因此也是不可变的。

要解决这个问题,

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

要么:

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

更新

从Xcode 6 Beta 5开始,您可以更新存储在可选variables中的集合,所以原始代码现在可以工作:

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

数组是值types(结构),所以它们是按值而不是按引用传递的。

也就是说,如果你创build一个数组types的variables并为其赋予不可变数组,那么实际上就会创build一个不可变数组的副本并将其分配给它 – 当然,该副本与原始的不可变数组没有任何关系值创build时)。

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

在你的情况下,你正在访问一个不可变的数组,这是AnyObjectNSArray (参见文档 )。 你可以在swift中使用它作为一个Array,复制它并修改如下:

 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] 

完成更改后,可以将其分配给items属性

这和向你的数组声明var一样简单。

 var items = toolbar.items 

现在,您可以更改项目,然后重新分配到工具栏。

 toolbar.items = items 

请注意,您不能(从Beta 3开始)更改使用let声明的“不可变”数组的元素。 只是arrays的长度是固定的,这就是为什么你不能删除项目。

但是,根据Apple的UIToolbar文档, items数组已经是可变的了。

迅速
var items: [AnyObject]!

经过testing+作品:

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

从一个arrays的特定索引中删除一个对象。

 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) 

在Beta3中,常量数组是完全不可变的,而variables数组是完全可变的。 所以只需要改变let array:var array:然后validation你的代码