【发布时间】:2014-06-22 09:08:01
【问题描述】:
当集合被分配给可选变量时,我似乎无法让它们变得可变。在下面的示例代码中, NonOptional 按预期工作。 var 将保持集合上的可变状态。没有本地变量,我可以直接使用变量字段。但是我不确定如何让 var 具有不可变的集合,我应该假设“let”而不是“var”可以解决问题吗?
尽管如此,查看 Optional 类,需要一个本地 var 来为集合提供一个可变状态(即使 XCode 在我不使用本地 var 时建议 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)
}
}
}
【问题讨论】:
-
除非您在
local或question上调用mutating方法,否则它们将指向相同 实例。在您调用任何mutating方法后,它们将指向不同的实例。创建新实例将花费O(n)时间。你可以在这里阅读更多信息:developer.apple.com/library/prerelease/ios/documentation/swift/…
标签: swift