注意:我知道有很多类似的问题,至少在";什么是ArraySlice
?我该如何处理它&";。我还没有找到一个我理解的答案,或者解释处理这个问题的正确方法(对于我们这些不了解Swift的人来说)。
内容
在Python等语言中,从数组切片创建新数组是一个常见的函数,也是可行的,但在swift中,由于ArraySlice
的原因,它并不那么简单。
考虑以下示例:
struct MyStruct {
var myValue = 0
init(value:Int) {
self.myValue = value
}
}
var myArray = [MyStruct]()
for i in 0...10 {
myArray.append(MyStruct(value: i))
}
var myOtherArray: [MyStruct]
myOtherArray = myArray[0...4]
这引发了错误:
Cannot subscript a value of type '[myStruct]' with an index of type 'CountableClosedRange<Int>'
一些类似的问题有关于类型铸造的答案,并建议:
if let mySlice = myArray[0...4] as? [MyStruct] {
myOtherArray = mySlice
}
但是这种类型的铸造总是会失败。
但大多数答案给出了一个更直接的方法:
let mySlice = myArray[0...4]
myOtherArray = Array(mySlice)
这在该示例中不会导致错误。
然而,如果我们把复杂性提高一点:
class MyClass {
var array = [MyStruct]()
init(length: Int) {
for i in 0...length {
self.array.append(MyStruct(value: i))
}
}
init(myArray: [MyStruct]){
self.array = myArray
}
}
var myInstance = MyClass(length: 10)
myInstance.array[0...4]
var myNewInstance = MyClass(myInstance.array[0...4])
仍然会导致预期的错误,但现在:
let mySlice = myInstance.array[0...4]
var myNewInstance = MyClass(mySlice)
不起作用,错误是缺少可用的过载。对我可以通过向MyClass
添加以下内容来重载此行为
init(_ myArray: ArraySlice<MyStruct>){
self.array = Array(myArray)
}
太棒了。
问题
有人能解释一下为什么从子数组中制作一个新数组需要付出这么多努力吗?_ :
的特殊重载声明是什么?
任何时候你想从ArraySlice
创建一个新的Array
,你只需将幻灯片传递到Array
的初始值设定项:
let sourceArray = [1, 2, 3]
let slice = sourceArray[0...1]
let array = Array(arraySlice)
你自己在问题中提到了这一点。我不确定混乱在哪里。在你的特定例子中,你只会这样做:
var myNewInstance = myClass(Array(myInstance.array[0...4]))
现在,为了解释"特殊重载声明_ :
",正如你所说的。_
只是用来煽动参数不应该有关键字的令牌。
如果声明是这样的:
init(myArray: ArraySlice<myStruct>)
它会被这样称呼:
myClass(myArray: someSlice)
但是myArray
关键字没有添加任何有意义的信息,只是扰乱了呼叫站点。您可以通过显式地将关键字设置为_
:来删除关键字(默认情况下,该关键字设置为参数的名称)
init(_ myArray: ArraySlice<myStruct>)
是这样称呼的:
myClass(someSlice)