【问题标题】:Subarrays not working in Swift 3子数组在 Swift 3 中不起作用
【发布时间】:2017-11-26 16:15:17
【问题描述】:

在 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 中是否有效。

【问题讨论】:

    标签: swift3 sub-array


    【解决方案1】:

    这是因为使用范围下标会给您一个ArraySlice&lt;T&gt;

    您试图将ArraySlice&lt;Bool&gt; 分配给[Bool],这会导致类型不匹配。 swift 编译器显然太愚蠢了,无法指出这一点。 swift 编译器搜索返回 [Bool] 但找不到任何下标,所以它告诉您不能下标……这是一个非常奇怪的逻辑。也许这会在 Swift 4 中得到解决。

    只需初始化一个新的[Bool]

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

    【讨论】:

    • 我不同意,这是愚蠢的...... Swift 是类型选择,我喜欢这种行为。
    • @user3441734 好吧,它至少应该说“你不能将ArraySlice 分配给Array”,而不是像“哦,你不能下标!”之类的话。
    • @Sweeper 这是真的,
    【解决方案2】:
    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]
    

    【讨论】:

    • 虽然此代码可能会回答问题,但提供有关 如何 和/或 为什么 解决问题的附加 context 将改善答案的长度长期价值。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人!请edit您的答案添加解释,并说明适用的限制和假设。提及为什么这个答案比其他答案更合适也没有什么坏处。
    • @Dev-iL 我做了......对不起
    • 不用抱歉 :) 你的回答是可以接受的,但现在更好了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-07
    • 2018-01-13
    • 2017-09-12
    • 1970-01-01
    相关资源
    最近更新 更多