[英]Swift Error: Cannot convert value of type 'ArraySlice' to expected argument type
[英]Swift 3.0 inout ArraySlice: please explain getting, passing and overloading functions dealing with this type
注意:我知道那里有很多類似的問題-至少關於“什么是ArraySlice
以及我如何使用它?”。 我還沒有找到一個我都理解的答案,該答案說明了解決此問題的正確方法(向那些不了解Swift角落的人)。
在像Python這樣的語言中,使用數組切片創建一個新數組是一種常見的功能並且可行,但是由於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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.