Swift 结构的下标不';t当创建为隐式展开的可选项时设置值

Swift 结构的下标不';t当创建为隐式展开的可选项时设置值,swift,class,struct,swift2,optional,Swift,Class,Struct,Swift2,Optional,当“Foo”是一个隐式展开的可选值时,为什么不能使用下标更改“numbers”数组 struct Foo { var numbers = [0,0,0] subscript(index: Int) -> Int { get { return self.numbers[index] } set { self.numbers[index] = newValue } } } var fooA:Foo! fooA = Foo() foo

当“Foo”是一个隐式展开的可选值时,为什么不能使用下标更改“numbers”数组

struct Foo {
    var numbers = [0,0,0]
    subscript(index: Int) -> Int {
        get { return self.numbers[index] }
        set { self.numbers[index] = newValue }
    }
}


var fooA:Foo!
fooA = Foo()

fooA[1] = 1              // does not change numbers array
fooA[1]                  // returns 0

fooA.numbers[1] = 1      // this works
fooA[1]                  // returns 1

var fooB:Foo!
fooB = Foo()

fooB![1] = 1              // this works
fooB![1]                  // returns 1
出于某种原因,当我将“Foo”作为一个类(下面称为“Goo”)时,它会起作用

它看起来像一个bug(或者我错过了一些重要的东西),检查这个

struct Foo {
    var numbers = [0,0,0]
    subscript(index: Int) -> Int {
        get {
            return self.numbers[index]
        }
        set {
            numbers[index] = newValue
        }
    }
}


var fooA:Foo! = Foo()
// here is the difference
fooA?[1] = 1
fooA[1]                  //  1
fooA.numbers[1] = 1
fooA[1]                  //  1
更“复杂”的实验

struct Foo {
    var numbers = [0,0,0]
    subscript(index: Int) -> Int {
        get {
            return numbers[index]
        }
        set {
            print(numbers[index],newValue)
            numbers[index] = newValue
            print(numbers[index])
        }
    }
}


var fooA:Foo! = Foo()

fooA[1] = 1
fooA[1]                  // 0
// but prints
// 0 1
// 1
为了更多的“乐趣”

var fooA:Foo! = Foo()
if var foo = fooA {
    foo[1] = 1
    print(foo)
}
印刷品

"Foo(numbers: [0, 1, 0])\n"

当您显式地打开变量时,它会工作:`fooA![1] = 1` . 但是在声明任何隐式展开的可选变量之前,应该考虑使用非可选的懒惰初始化:<代码> var Voaa:Foo= {RealFoeToE()}()< /COD>这是真的。但是为什么不显式地展开变量它就不能工作呢?我不知道,这就是为什么我写了一个注释而不是一个答案;-)@瓦迪安,这就是问题所在。变量i:Int!!!=10; 打印(一)//10?????????它看起来真的,真的很奇怪!但是它是有效的(未知原因)将下标中的
集合
替换为
变异集合
会有什么不同吗?假设你是对的,我在哪里以及如何报告swift错误?如果你有开发者帐户,在apple radarat least fooA上执行此操作?[1]应被视为无效表达式
"Foo(numbers: [0, 1, 0])\n"