如何在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
在你的情况下,你正在访问一个不可变的数组,这是AnyObject
的NSArray
(参见文档 )。 你可以在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你的代码