[英]Swift optional Array property is immutable?
我正在构造一个布尔数组来将节的状态存储在UICollectionView中。 这是一个存储为我的UIViewController属性的变量:
var _weekSelections : Array<Bool>!
然后,在一个由loadView()调用的函数中,我构造数组并将一个值分配给第一个索引:
_weekSelections = Array<Bool>(count:_weekCount, repeatedValue:false)
_weekSelections[0] = true
索引0处的值保持为假! 该数组是已构造的,并且具有多个元素,但是我对索引所做的任何分配都不会影响存储在该索引处的值,即使我在下一行代码中检查该值也是如此。 我知道,如果我执行可能会更改其长度的操作,则Swift会复制数组,但是我不认为这是我可以复制的情况。 我可以更改任何值的唯一方法是手动创建副本,如下所示:
var copy = _weekSelections
copy[0] = true
_weekSelections = copy
我是否缺少明显的东西,或者这可能是一个奇怪的错误?
为了使我的代码基于SO而不是Pastebin,这是我的观察。 在从Objective C类派生的Swift类中使用可选数组时,这看起来像某种错误或意外行为。 如果您使用普通的Swift类,则可以按预期工作:
class Foo {
var weekSelections: Array<Bool>!
func test() {
weekSelections = Array<Bool>(count: 10, repeatedValue: false)
weekSelections[0] = true;
println(weekSelections[0]) // Prints "true"
}
}
var foo = Foo()
foo.test()
但是,如果从NSObject派生Foo:
import Foundation
class Foo : NSObject { // This derivation is the only difference from the code above
var weekSelections: Array<Bool>!
func test() {
weekSelections = Array<Bool>(count: 10, repeatedValue: false)
weekSelections[0] = true;
println(weekSelections[0]) // Prints "false"
}
}
var foo = Foo()
foo.test()
即使在这种情况下,如果您在初始化程序中进行weekSelections初始化,它也可以工作:
class Foo : NSObject {
var weekSelections: Array<Bool>!
init() {
weekSelections = Array<Bool>(count: 10, repeatedValue: false)
weekSelections[0] = true;
println(weekSelections[0]) // Prints "true"
}
}
var foo = Foo()
就个人而言,我会说这是一个错误。 我在任何文档中都找不到任何能解释从NSObject派生时行为差异的文档。
我也看不到任何表示可选数组属性是不可变的信息。 当您认为“不变”数组实际上在Swift中是可变的时,这将尤其奇怪,即:
// Use "let" to declare an "immutable" array
let weekSelections = Array<Bool>(count: 10, repeatedValue: false)
weekSelections[0] = true;
println(weekSelections[0]); // Prints "true"; arrays are never really "immutable" in Swift
...运作良好,即使看起来有些奇怪,目前也被证明是有效的。
就我个人而言,我将使用任何可能的解决方法,并向Apple提出错误,以了解它们可以解决的问题。
不是解释,而是解决方法。 问题不在于count:repeatedValue
初始值设定项,而在于将数组分配给可选变量。 据我所知,可选数组只能使用访问器方法,而不能使用mutator方法-实际上,它们是不可变的。 尝试将_weekSelections
临时分配给非可选变量,然后再尝试更改其内容(并在完成后分配回_weekSelections
)将起作用。 请注意,这似乎会在分配上创建一个新数组(具有相同的元素),因此如果数组很大,可能要考虑内存问题。 当然,首先简单地使用非可选变量也可以。
至于为什么可选数组不可变,这可能是一个错误,或者可能有一些深奥的原因,我对此并不了解。 还有其他人听起来很合理吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.