Swift 中的多种索引类型

Multiple index types in Swift

在 Swift(一种我还很陌生的语言)中,我试图定义一个允许使用 Int 或 [=18 进行索引的 class =].例如:

var m = Matrix(rows: 10, cols: 10)
var v = m[1, 0..<10]

我能想到的解决这个问题的两种方法是向范围 class:

添加扩展
extension Range {
  init(_ intValue:Element) {
    self.init(start: intValue, end: intValue.successor())
  }
}

或创建一个允许任一类型的枚举:

enum IndexType {
    case value(Int)
    case range(Range<Int>)

    init(_ v:Int) {
        self = .value(v)
    }

    init(_ r:Range<Int>) {
        self = .range(r)
    }
}

但是,这两种解决方案都无法按预期工作,因为我仍然需要手动指定类型。例如,给定函数:

func slice(indices:IndexType...) -> [Double] {
  // ...
}

那我不能只做:

slice(1, 3...4, 5)

而是必须做:

slice(IndexType(1), IndexType(3...4), 5)

在 Swift 中有没有办法做到这一点?我习惯了 c++,它会自动进行类型推断,但似乎不适用于 Swift.

我发现的一个类似问题是: Swift Arrays of Multiple Types

但是,我真的很想避免使用 Any,因为我知道它应该是两种类型。

protocol MatrixIndex {
    var Matrix_range: Range<Int> { get }
}

extension Int : MatrixIndex {
    var Matrix_range: Range<Int> {
        get {
            return Range<Int>(start: self, end: self+1)
        }
    }
}

extension Range : MatrixIndex {
    var Matrix_range: Range<Int> {
        get {
            return Range<Int>(start: self.startIndex as! Int, end: self.endIndex as! Int)
        }
    }
}

class Matrix {
    subscript(row: MatrixIndex, column: MatrixIndex) -> () {
        get {
            print("getting \(row.Matrix_range) \(column.Matrix_range)")
        }

        set(newValue) {
            print("setting \(row.Matrix_range) \(column.Matrix_range)")
        }
    }
}