如何在swift中创建不可变数组的可变副本?

Joh*_*ton 18 arrays ios swift

现在,由于完整的值语义,Swift的Array是真正不可变的,我如何创建一个不可变数组的可变副本?与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]
Run Code Online (Sandbox Code Playgroud)

我正在使用Beta 3

vac*_*ama 20

问题是这self.toolbar.items是一个隐式解包的可选(类型为[AnyObject]!),它们总是不可变的.当您在toolbarItems没有明确说明其类型的情况下分配给变量时,它也会变成一个隐式展开的可选项,因此也是不可变的.

要解决这个问题,请执

var toolbarItems:[AnyObject] = self.toolbar.items
toolbarItems.removeAtIndex(2)
Run Code Online (Sandbox Code Playgroud)

要么:

var toolbarItems = self.toolbar.items as [AnyObject]
toolbarItems.removeAtIndex(2)
Run Code Online (Sandbox Code Playgroud)

更新

从Xcode 6 Beta 5开始,您可以更新存储在可选变量中的集合,因此原始代码现在可以正常工作:

var toolbarItems = self.toolbar.items
toolbarItems.removeAtIndex(2)
Run Code Online (Sandbox Code Playgroud)


Ant*_*nio 13

数组是值类型(struct),因此它们是按值传递的,而不是通过引用传递的.

也就是说,如果你创建一个数组类型的变量并为它分配不可变数组,实际上会创建一个不可变数组的副本并将其赋值给它 - 当然该副本与原始不可变数组没有任何关系(除了具有相同的数组)创建时的值).

let immutable = [1, 2, 3]

//immutable[0] = 1 // Fails, ok

var mutable = immutable

mutable[0] = 5
Run Code Online (Sandbox Code Playgroud)

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

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]
Run Code Online (Sandbox Code Playgroud)

完成更改后,您可以分配给该items属性