Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Swift可选数组属性是不可变的?_Arrays_Swift_Immutability_Optional - Fatal编程技术网

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

Arrays Swift可选数组属性是不可变的?,arrays,swift,immutability,optional,Arrays,Swift,Immutability,Optional,我正在构造一个布尔数组,以在UICollectionView中存储节的状态。它是存储为my UIViewController属性的变量: var _weekSelections : Array<Bool>! 我是否遗漏了一些明显的错误,或者这可能是一个奇怪的错误?不是一个解释,而是一个解决方法。问题不在于count:repeatedValue初始值设定项,而在于将数组分配给可选变量。据我所知,可选数组只能使用accessor方法,不能使用mutator方法——实际上它们是不可变的。

我正在构造一个布尔数组,以在UICollectionView中存储节的状态。它是存储为my UIViewController属性的变量:

var _weekSelections : Array<Bool>!

我是否遗漏了一些明显的错误,或者这可能是一个奇怪的错误?

不是一个解释,而是一个解决方法。问题不在于
count:repeatedValue
初始值设定项,而在于将数组分配给可选变量。据我所知,可选数组只能使用accessor方法,不能使用mutator方法——实际上它们是不可变的。在尝试更改非可选变量的内容之前,将
\u weekSelections
临时分配给该变量(并在完成后重新分配给
\u weekSelections
)将起作用。请注意,这似乎在分配上创建了一个新的数组(具有相同的元素),因此如果数组非常大,可能会考虑内存问题。当然,首先简单地使用非可选变量也可以


至于为什么可选数组是不可变的,这可能是一个bug,或者可能有一些深奥的原因,我不清楚。还有人有一个听起来似乎合理的理论吗?

为了让我的代码运行在SO而不是Pastebin上,下面是我的观察结果。在从目标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()
class-Foo{
var:数组!
func测试(){
weekSelections=数组(计数:10,重复值:false)
weekSelections[0]=真;
println(weekSelections[0])//打印“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()
<代码>导入基础 类Foo:NSObject{//此派生与上面的代码唯一不同 var:数组! func测试(){ weekSelections=数组(计数:10,重复值:false) weekSelections[0]=真; println(weekSelections[0])//打印“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()
类Foo:NSObject{
var:数组!
init(){
weekSelections=数组(计数:10,重复值:false)
weekSelections[0]=真;
println(weekSelections[0])//打印“true”
}
}
var foo=foo()
我个人认为这是一个bug。我在任何文档中都看不到任何东西可以解释从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
//使用“let”声明“不可变”数组
let weekSelections=数组(计数:10,重复值:false)
weekSelections[0]=真;
println(周选举[0]);//打印“真”;数组在Swift中从来都不是真正的“不变的”
…工作正常,目前被证明是有效的,即使它看起来有点奇怪


就我个人而言,我会尽你所能解决问题,并与苹果公司建立一个漏洞,看看他们能发出什么光芒。

很有趣。我可以复制这一点,但是如果我将代码从
loadView()
移动到
init()
调用,它就会工作。仍在试图弄清楚发生了什么。所有类型的数组都会发生这种情况,至少在全局存储和loadView()或其后代中会发生这种情况。我在文档中找不到指定全局数组和本地存储数组的不同修改行为的任何内容,如果你说的是真的,那么它一定是不同的。这里有一件奇怪的事情:我可以在你的代码工作正常的操场上创建一个最小的Swift类。然后,如果我说它继承自NSObject,我可以用它重现您的问题。这是唯一的改变。我已经复制了大约12行代码。。。记者:顺便问一下,“全球存储”到底是什么意思?完全在类外,在全局范围内?(我可以用这个类的存储属性复制它…)对不起,我的术语不清楚。我的意思是一个存储的变量,它是类的一个属性。在问题中更改它。这是一个可选变量的问题,这是一个信息,但您描述的解决方法是我在问题中已经包含的方法。至于使用非可选变量,我可以这样做,但随后我将被迫静态地或在对象初始化期间对其进行初始化,我不知道它将有多大,直到我使用加载的数据计算_weekCount。我更愿意等待并使用count:repeatedValue:initializer。@EricGratta:而不是编辑问题的主题,以表明您理解问题不在于initializer。你肯定给人留下了这样的印象。直到现在我才知道这不是一个问题@EricGratta:你可以用一个空数组初始化它,以后再重新赋值。@EricGratta:更好的主题。解决方法仍然适用于您。见上面的评论。
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()
// 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