【问题标题】:Error: Cannot subscript a value of type 'X' with ...'错误:不能用 ...' 为类型为“X”的值下标
【发布时间】:2018-06-23 00:31:27
【问题描述】:

错误:无法使用“(安全:Int)”类型的索引为“[CustomClass]”类型的值下标

class CustomClass {
  let value: String
  init(value: String) {
    self.value = value
  }
}

extension Collection {

  subscript(safe: Int) -> Element? {
    if safe > count-1 {
      return nil
    }
    return self[safe]
  }
}

let steps: [CustomClass] = []

if let step = steps[safe: 4] { // error here
}

为什么会这样?

【问题讨论】:

  • stackoverflow.com/questions/25329186/…。我认为参数 nam 可能存在问题,因为 'safe' 在某些情况下是关键字。
  • 默认情况下下标不会自动获取与参数名称等效的参数标签;您需要明确说明它们,例如 subscript(safe safe: Int) -> Element?,或者更好的是 subscript(safe index: Int) -> Element?(如 Q&A Sulthan 链接中所示),因为 safe 不是局部变量的好名称。

标签: swift syntax subscript


【解决方案1】:

请注意,除了 @Hamish 在 cmets 中已经提到的下标参数问题之外,您的代码中还有一些其他问题:ArraySlice 也符合 RandomAccessCollection 因此仅检查数组计数并不能保证它是安全的指数。您应该添加一个guard 语句来检查indices 属性是否包含Index。您还应该将下标参数更改为Index 而不是Int

class CustomClass {
    let value: Int
    init(value: Int) {
        self.value = value
    }
}

extension Collection  {
    subscript(safe index: Index) -> Element? {
        guard indices.contains(index) else {
            return nil
        }
        return self[index]
        // or simply
        // return indices.contains(index) ? self[index] : nil
    }
}

游乐场测试:

let steps = [CustomClass(value: 0),CustomClass(value: 1),CustomClass(value: 2),CustomClass(value: 3),CustomClass(value: 4),CustomClass(value: 5),CustomClass(value: 6)]

if let step6 = steps[safe: 6] {
    print(step6.value)  // 6
}

let stepsSlice = steps[0...4]
let step6 = stepsSlice[safe: 6]
print(step6?.value)   // nil

【讨论】:

    猜你喜欢
    • 2019-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2018-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多