繁体   English   中英

Swift可选的Array属性是不可变的吗?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM