我正在构建一个布尔数组,用于在UICollectionView中存储节的状态.它是作为我的UIViewController的属性存储的变量:
var _weekSelections : Array<Bool>!
然后,在loadView()调用的函数中,构造数组并为第一个索引赋值:
_weekSelections = Array<Bool>(count:_weekCount,repeatedValue:false) _weekSelections[0] = true
索引0处的值仍为false!数组是构造的,并且有多个元素,但是我对索引的任何赋值都不会影响存储在该索引处的值,即使我检查下一行代码的值.我知道如果我执行一个可能改变其长度的动作,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
…工作正常,并且目前被记录为有效,即使它看起来有点奇怪.