我似乎无法让集合在分配给可选变量时是可变的。在下面的示例代码中,NonOptional按预期工作。 var将保持集合上的可变状态。没有局部变量,我可以直接使用变量字段。然而我不确定如何使用不可变集合来增加变量,我应该假设“let”而不是“var”会做什么?然而,看着Optional类,需要一个局部变量赋予集合一个可变状态(即使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)
}
}
}
除非你调用一个'mutating'方法在'local'或在'question' ,他们会指向_same_实例。在你调用任何'mutating'方法之后,他们会指向不同的实例。创建新实例将花费'O(n)'时间。你可以在这里阅读更多关于它的信息:https://developer.apple.com/library/prerelease/ios/documentation/swift/conceptual/swift_programming_language/ClassesAndStructures.html – holex