什么是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…米”