【问题标题】:Check valid index for 2D array swift快速检查二维数组的有效索引
【发布时间】:2021-01-12 04:45:02
【问题描述】:

我有一个二维数组,我正在尝试检查索引是否有效。

下面是我的代码,它按预期工作。

我很想知道这是否是正确的解决方案?我确信应该有一个非常简洁的解决方案,而不是我所做的。请指教

fileprivate func isValid(index1: Int, index2: Int) -> Bool {
    return myArray?.indices.contains(index1) ?? false && myArray?[index1].indices.contains(index2) ?? false
}

【问题讨论】:

  • 您为什么不为其编写一些测试,并以一种不仅可以验证您今天的工作,还可以自动检查它在未来更改后是否保持正确的方式进行检查?
  • 如果您将myArray 设为非可选,您将大大简化此操作。 “空数组”和“无数组”在您的系统中是否存在实际差异?如果没有,那么只需使用[] 而不是 nil。永远记住,[[]] 不是二维数组。它是一个数组数组。如果你想构建一个二维数组,那么你需要在一个简单的数组之上构建它,并使用乘法和加法来访问它。
  • 不确定contains 在这种情况下有多快,但一种选择是index1 >= 0 && index1 < myArray.count 等等
  • @LeoDabus 这表明即使是非常简单和明显的属性也值得阅读文档,谢谢。
  • @JoakimDanielson (1...10).contains(5) 将产生与1 <= 5 && 5 <= 10 完全相同的机器代码,而不会混淆<><=>=&&||。我通常建议人们专门将其用于 int 范围检查,手动滚动相同的定义,使其更长/更混乱,并且通常会出现 off-by-1 错误

标签: ios arrays swift multidimensional-array


【解决方案1】:

正如@Rob Napier 在评论中已经提到的,您应该将您的数组声明为非可选并使用空集合[] 对其进行初始化。要检查您的集合和子集合是否有有效的索引,最好将Collection 限制其元素到另一个Collection

extension Collection where Element: Collection {
    func contains(index: Index, subIndex: Element.Index) -> Bool {
       indices.contains(index) && self[index].indices.contains(subIndex)
   }
}

let arrayOfarrays = [[1,2,3],[4,5],[6]]
arrayOfarrays.contains(index: 2, subIndex: 0)  // true
arrayOfarrays.contains(index: 2, subIndex: 1)  // false
arrayOfarrays.contains(index: 3, subIndex: 0)  // false

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-24
    • 1970-01-01
    • 2023-02-10
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 2019-07-24
    相关资源
    最近更新 更多