gpt4 book ai didi

arrays - Swift 可选数组属性是不可变的?

转载 作者:IT王子 更新时间:2023-10-29 05:53:30 25 4
gpt4 key购买 nike

我正在构建一个 bool 值数组来存储 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 提出错误,看看他们能揭示什么。

关于arrays - Swift 可选数组属性是不可变的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24411243/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com