什么是Swift中的一部分?

什么是Swift中的一个分片,它与数组有什么不同?

从文档中,下标(Range)的types签名是:

subscript(Range<Int>) -> Slice<T> 

为什么不返回另一个Array<T>而不是一个Slice<T>

它看起来像我可以连接一个切片与数组:

 var list = ["hello", "world"] var slice: Array<String> = [] + list[0..list.count] 

但是这会产生错误:

找不到接受提供的参数的'下标'重载

 var list = ["hello", "world"] var slice: Array<String> = list[0..list.count] 

什么是切片?

切片指向数组。 当数组已经存在并且切片只能描述所需的部分时,没有任何意义。

这种加法会导致隐含的强制,所以它起作用。 为了使您的任务工作, 将需要强制:

 var list = ["hello", "world"] var slice: Array<String> = Array(list[0..<list.count]) 

注意:从Swift beta 3开始,这个答案是无效的,因为数组现在是真正的值types。


@matt是正确的,上面 – Slice<T>指向数组。 这似乎与Swift处理我们正在处理的所有其他数据types的方式相反,因为它意味着片的值即使被声明为常量也可以更改:

 var arr = ["hello", "world", "goodbye"] // ["hello", "world", "goodbye"] let slice = arr[0..2] // ["hello", "world"] arr[0] = "bonjour" println(slice) // ["bonjour", "world"] 

最糟糕的部分就是分片就像一个数组一样。 鉴于在Swift中我们有一个不变性的期望,切片的下标值可以在没有警告的情况下改变似乎是危险的:

 println(slice[1]) // "world" arr[1] = "le monde" println(slice[1]) // "le monde" 

但是,如果底层arrays变化太剧烈,他们会解开:

 arr.removeAtIndex(0) // this detaches slice from arr println(slice) // ["bonjour", "le monde"] arr[0] = "hola" println(slice) // ["bonjour", "le monde"] 

概要:

上面的答案是正确的,直到Beta 3(并可能在未来的版本中再次发生变化)

Slice现在就像一个数组一样,但是正如上面所说的@matt,实际上是对数组下的一个数组的浅拷贝,直到做出改变。 切片(现在)查看原始值的快照,

另请注意,切片语法已更改:

 [from..upToButNotIncluding] -> [from..<upToButNotIncluding] 

例:

 var arr = ["hello", "world", "goodbye"] // ["hello", "world", "goodbye"] var arrCopy = arr let slice = arr[0..<2] // ["hello", "world"] arr[0] = "bonjour" arr // ["bonjour", "world", "goodbye"] arrCopy // ["hello", "world", "goodbye"] slice // ["hello", "world"] 

这允许更加统一的处理,因为它更简单(恕我直言)做python样式列表处理 – 过滤一个列表做另一个。 根据马特在Beta 3之前的回答,你必须创build一个临时数组来映射切片。 新代码现在更简单:

 class NameNumber { var name:String = "" var number:Int = 0 init (name:String, number:Int) { self.name = name self.number = number } } var number = 1 let names = ["Alan", "Bob", "Cory", "David"] let foo = names[0..<2].map { n in NameNumber(name:n, number:number++) } foo // [{name "Alan" number 1}, {name "Bob" number 2}] 

(虽然公平,但foo仍然是一个片段)

参考:

Developer_Tools/xcode_6_beta_3_lpw27r/xcode_6_beta_3_release_notes__.html

重要的变化,解决的问题, – 迅速的语言,第1段

“在Swift中的数组已经完全重新devise,以具有完整的价值语义像字典和string…米”