Swift 如何对可变集合使用可选变量?

Swift 如何对可变集合使用可选变量?,swift,Swift,当集合被分配到可选变量时,我似乎无法使它们变为可变的。在下面的示例代码中,非可选项按预期工作。var将保持集合上的可变状态。没有局部变量,我可以直接使用变量字段。然而,我不知道如何让变量具有不可变的集合,我是否应该假设“let”而不是“var”会起作用 尽管如此,在这个可选类中,需要一个局部变量来为集合提供一个可变状态(即使在我不使用局部变量时XCode建议append())。这真的是我应该通过添加局部变量来编写代码来更新集合的方式吗?有没有更简洁的方法不使用局部变量?我很想知道一个集合的分配是

当集合被分配到可选变量时,我似乎无法使它们变为可变的。在下面的示例代码中,非可选项按预期工作。var将保持集合上的可变状态。没有局部变量,我可以直接使用变量字段。然而,我不知道如何让变量具有不可变的集合,我是否应该假设“let”而不是“var”会起作用

尽管如此,在这个可选类中,需要一个局部变量来为集合提供一个可变状态(即使在我不使用局部变量时XCode建议append())。这真的是我应该通过添加局部变量来编写代码来更新集合的方式吗?有没有更简洁的方法不使用局部变量?我很想知道一个集合的分配是一个简单的别名,还是一个简单的复制,或者是浅层的还是深层的

   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)
            }
        }
    }
这是错误的。那里的
var
表示可选引用是“可变的”,即它可以是
nil
或设置为实际数组。然后,Swift默认设置为使数组不可变


关于数组和易变性的许多小细节目前都在不断变化,我希望在未来几周内会有修复、更改和明确的定义。

这个问题是在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"])

除非您在
本地
问题
上调用
mutating
方法,否则它们将指向同一个实例。在您调用任何
mutating
方法后,它们将指向不同的实例。创建新实例将需要
O(n)
time。你可以在这里读到更多关于它的内容:很高兴听到。我知道这不是一个发表意见的好地方,所以让我提出一个建议,即使我为此受到抨击:我已经看到我自己与Swift就这类问题进行了很多斗争。也许语言太过努力了,不确定。为了保存一个关键字,如mut/mutating,这种语法不容易编写,甚至不容易阅读。我更喜欢使用Rust或OCaml这样的语言,当你可以明确地告诉变量是变异的还是非变异的。今天,不可变数组实际上是可变的减去大小变化,所以我认为一个新的关键字可以在清晰性和正确性方面解决问题,你可以将不可变数组作为变量进行变异只要你不改变它们的大小,显然至少在未来的版本中会得到修复。Se我们将得到真正的不可变数组。同时,你建议我怎么做?坚持使用类似桥接的语法的NSMutable数组,或者使用上面的var技巧,从本质上重新定义数组为函数范围内的可变数组?只是尝试一下o找出解决语言设计中的一大缺陷的最佳方法。我有点困惑地看到这一问题将在以后得到解决。毕竟,内存管理感觉它应该更牢固地固定在语言蓝图中。我不知道您的具体情况,但我会使用默认的空array,因此我没有可选类型。然后我有一个很好的可变数组,默认为空数组。否则,我将使用上面的技巧。顺便说一句,您可以直接就地初始化属性
var myArray=String[]()
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"])