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

我正在构建一个布尔数组,用于在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

…工作正常,并且目前被记录为有效,即使它看起来有点奇怪.

就个人而言,我会使用任何可行的解决方法,并向Apple提出一个错误,看看它们可以摆脱什么样的光.

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...