如何使用可变集合的可选变量?

时间:2014-06-22 09:08:02

标签: swift

当将集合分配给可选变量时,我似乎无法使集合变得可变。在下面的示例代码中,NonOptional按预期工作。 var将保持集合上的可变状态。没有本地变量,我可以直接使用变量字段。但是我不确定如何使用不可变集合的变量,我是否应该假设“let”而不是“var”才能解决这个问题?

然而,查看Optional类,需要一个局部var来为集合提供一个可变状态(即使XCode在我不使用local var时建议使用append())。这是否真的是我应该通过添加局部变量来编写代码来更新集合的方式?有没有使用本地var的更简洁的方法?我很想知道一个集合的赋值是一个简单的别名,还是它做了一个副本,无论是浅的还是深的?

   class NonOptional {
        var exclamation: String[] // using var should set that collection as mutable...

        init() {
            self.exclamation = []
        }

        func write() {
            self.exclamation.append("exclamation")
        }

        func delete() {
            if self.exclamation.count > 0 {
                self.exclamation.removeAtIndex(0)
            }
        }
    }

    class Optional {
        var question: String[]? // using var should set that collection as mutable...

        init() {
            self.question = []
        }

        func write() {
            var local = self.question! // copy or pass by ref?
            local.append("question")    // why can't I just do self.foo!.append("foo") ?
        }

        func delete() {
            if self.question!.count > 0 {
                var local = self.question!
                local.removeAtIndex(0)
            }
        }
    }

2 个答案:

答案 0 :(得分:1)

当Swift 1仍然处于测试阶段时,这个问题被问到了,并且自那以后发生了很多变化(虽然我不完全确定Swift 1中是否存在这个特殊功能)。

对于后人来说,在Swift 3中改变可选数组是没有问题的。这就是你要做的:

var strings: [String]? = ["a", "b"]
strings?[0] = "A"
// strings is now Optional(["A", "b"])
strings?.append("c")
// strings is now Optional(["A", "b", "c"])
strings?.remove(at: 1)
// strings is now Optional(["A", "c"])

答案 1 :(得分:0)

var question: String[]? // using var should set that collection as mutable...

这是错误的。 var表示可选引用是“可变的”,即它可以是nil或设置为实际数组。然后Swift默认使数组不可变。

目前,有关阵列和可变性的许多小细节都有点不尽相同,我希望在未来几周内会有修复,变化和明确的定义。