子阵不是斯威夫特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])
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]
虽然这段代码可能会回答这个问题,但提供关于_how_和/或_why_的附加[context](https://meta.stackexchange.com/q/114762)它可以解决问题,可以改善答案长期的价值。请记住,你正在为将来的读者回答这个问题,而不仅仅是现在问的人!请编辑您的答案以添加解释,并指出适用的限制和假设。它也不会提到为什么这个答案比其他答案更合适。 –
@ Dev-iL我做了...对不起 – user3441734
不需要抱歉:)你的回答是可以接受的,但是现在它好多了! –
是的,这似乎工作。真的很可爱。 – Michel
我不同意,这是愚蠢的...... Swift是类型选择,我喜欢这种行为。 – user3441734
@ user3441734好吧,它至少应该说“你不能指定一个'ArraySlice'到'Array'”,而不是像“哦,你不能下标!” – Sweeper