现在,由于完整的值语义,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)
在你的情况,你正在访问一个不变的数组这是一个NSArray
的AnyObject
S(见文档).你可以在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
属性
归档时间: |
|
查看次数: |
28358 次 |
最近记录: |