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