子数组在 Swift 3 中不起作用

Subarrays not working in Swift 3

在 Swift 3 中,我有两个这样声明的变量:

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

稍后在我的代码中我有这个,以获取数组的一部分:

resultArray = patternArray [0..<4]

编译时收到此错误消息:

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

我不知道为什么。我犯了一些明显的错误吗?

我正在使用 Xcode 版本 8.3.2。

此外,我已经检查过这种语法在 Playground 中是否有效。

这是因为使用范围下标会给您 ArraySlice<T>

您正在尝试将 ArraySlice<Bool> 分配给 [Bool],这会导致类型不匹配。 swift 编译器显然太愚蠢了,无法指出这一点。 swift 编译器搜索 returns 和 [Bool] 的下标,但找不到任何下标,因此它告诉您不能下标……这是一个非常奇怪的逻辑。也许这会在 Swift 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 returns ArraySlice 类型的索引订阅数组,这有助于 "share" 原始数组的底层内存。为了能够将 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]