子阵不是斯威夫特3

问题描述:

工作在斯威夫特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。

此外,我已经检查了这种语法在游乐场中的作品。

这是因为使用范围的下标给你一个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

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

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