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)")
}
}
}
在 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)")
}
}
}