2017-06-23 56 views
1

工作在斯威夫特3我聲明如下兩個變量:子陣不是斯威夫特3

let patternArray = [true,true,false,true,true,false,true,true] 
var resultArray = [Bool]() 

在我的代碼後來我有這個,得到陣列的一部分:

resultArray = patternArray [0..<4] 

WHE compliling我收到此錯誤信息:

Cannot subscript a value of type '[Bool]' with an index of type 'CountableRange<Int>' 

我不知道爲什麼。我是否犯了一些明顯的錯誤?

我正在使用Xcode版本8.3.2。

此外,我已經檢查了這種語法在遊樂場中的作品。

回答

3

這是因爲使用範圍的下標給你一個ArraySlice<T>

您正試圖將ArraySlice<Bool>指定給[Bool],這會導致類型不匹配。 swift編譯器顯然太愚蠢,無法指出這一點。 swift編譯器搜索下標,返回[Bool],但找不到任何,所以它告訴你,你不能下標......這是一個很奇怪的邏輯。也許這將讓固定在斯威夫特4

只是初始化一個新的[Bool]

resultArray = [Bool](patternArray[0..<4]) 
+0

是的,這似乎工作。真的很可愛。 – Michel

+0

我不同意,這是愚蠢的...... Swift是類型選擇,我喜歡這種行爲。 – user3441734

+0

@ user3441734好吧,它至少應該說「你不能指定一個'ArraySlice'到'Array'」,而不是像「哦,你不能下標!」 – Sweeper

3
let patternArray = [true,true,false,true,true,false,true,true] 
var resultArray = [Bool]() 
resultArray = Array(patternArray[0..<4]) 

下標數組類型CountableRange的索引返回ArraySlice,這有助於「共享」的基本內存與原始陣列。爲了能夠將ArraySlice分配給具有Array類型的變量,必須將所有值複製爲獨立的Array。最簡單的方法是使用適當的構造函數創建如我的示例中所示的數組。

var arr = [1,2,3,4] 
let arrslice = arr[1..<3] 
for i in arrslice.indices { 
    arr[i] = 0 
} 
print(arr, arrslice) 

打印

[1, 0, 0, 4] [2, 3] 

更有趣:-)

arr[1..<3] = arrslice 
print(arr) 

打印

[1, 2, 3, 4] 
+0

雖然這段代碼可能會回答這個問題,但提供關於_how_和/或_why_的附加[context](https://meta.stackexchange.com/q/114762)它可以解決問題,可以改善答案長期的價值。請記住,你正在爲將來的讀者回答這個問題,而不僅僅是現在問的人!請編輯您的答案以添加解釋,並指出適用的限制和假設。它也不會提到爲什麼這個答案比其他答案更合適。 –

+0

@ Dev-iL我做了...對不起 – user3441734

+0

不需要抱歉:)你的回答是可以接受的,但是現在它好多了! –