2014-06-22 37 views
0

我似乎无法让集合在分配给可选变量时是可变的。在下面的示例代码中,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) 
      } 
     } 
    } 
+0

除非你调用一个'mutating'方法在'local'或在'question' ,他们会指向_same_实例。在你调用任何'mutating'方法之后,他们会指向不同的实例。创建新实例将花费'O(n)'时间。你可以在这里阅读更多关于它的信息:https://developer.apple.com/library/prerelease/ios/documentation/swift/conceptual/swift_programming_language/ClassesAndStructures.html – holex

回答

1

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

对于后人,变异,可选的阵列是斯威夫特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"]) 
0
var question: String[]? // using var should set that collection as mutable... 

这是不对的。那里的var表示可选的引用是'可变的',也就是说它可以是nil或者设置为一个实际的数组。 Swift默认使数组不可变。

许多关于数组和可变性的小细节现在有点不稳定,我预计会有修正,变化和明确的未来几周应该发生的定义。

+0

好听。我知道这不是一个好意见,所以让我提出一个建议,即使我受到了抨击:我已经看到自己在Swift这类问题上遇到了很多问题。也许这种语言试图太难以兼容,不确定。为了保存一个像mut/mutating这样的关键字,这个语法不容易编写,甚至不易读取。当你可以明确地告诉变量是否变化时,我更喜欢Rust或OCaml。今天非可变数组实际上是可变的负大小变化,所以我认为一个新的关键字可以解决事情的清晰度和正确性 – Laurent

+1

只要你不改变它们的大小,你可以改变不可变数组的问题显然是要至少在未来版本中得到修复。我们将得到真正不可变的数组。 – kmikael

+0

与此同时,你推荐我做什么?坚持使用类似语法的桥接NSMutable数组,或者使用上面的var技巧,基本上将数组重新定义为函数的作用域是可变的?试图找出什么是处理语言设计中一个很大缺陷的最佳方法。我有点闷闷不乐,看到这个问题将在稍后解决。毕竟,内存管理感觉应该更强烈地锚定到语言蓝图 – Laurent