gpt4 book ai didi

arrays - Swift 3.0 inout ArraySlice : please explain getting, 传递和重载处理此类型的函数

转载 作者:行者123 更新时间:2023-11-30 12:45:50 24 4
gpt4 key购买 nike

注意:我知道有很多类似的问题 - 至少在“什么是 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)

关于arrays - Swift 3.0 inout ArraySlice : please explain getting, 传递和重载处理此类型的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41656156/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com