Swift 快捷方便下标

Swift 快捷方便下标,swift,Swift,我可以在Swift中定义一个方便的下标设置器吗 例如,假设我: extension Matrix { subscript(_ i: Int, _ j: Int) -> Double { get { return value(atRow: i, column: j) } set { setValue(newValue, row: i, column: j) } } } 我还想定义一个接受Float的setter,因为我已经厌倦

我可以在Swift中定义一个方便的下标设置器吗

例如,假设我:

extension Matrix {
  subscript(_ i: Int, _ j: Int) -> Double {
    get {
      return value(atRow: i, column: j)
    }
    set {
      setValue(newValue, row: i, column: j)
    }
  }
}
我还想定义一个接受Float的setter,因为我已经厌倦了手动转换。我想做:

extension Matrix {
  subscript(_ i: Int, _ j: Int) -> Double {
    get {
      return value(atRow: i, column: j)
    }
    set {
      setValue(newValue, row: i, column: j)
    }
  }

  subscript(_ i: Int, _ j: Int) -> Float {
    set {
      setValue(Double(newValue), row: i, column: j)
    }
  }
}

但是我不能这样做,因为第二个下标没有getter。

因为Swift允许在返回值上重载(与Java和C++不同),所以可以添加一个
浮点
getter:

extension Matrix {
    subscript(_ i: Int, _ j: Int) -> Double {
        get { return value(atRow: i, column: j) }
        set { setValue(newValue, row: i, column: j) }
    }

    subscript(_ i: Int, _ j: Int) -> Float {
        get { return Float(value(atRow: i, column: j)) }
        set { setValue(Double(newValue), row: i, column: j) }
    }
}
但是,当您尝试在允许
浮点
双精度
的上下文中使用下标运算符时,会遇到麻烦。例如:

20. let m = Matrix()
21. let x = m[0, 0]

error: repl.swift:21:10: error: ambiguous use of 'subscript'
let x = m[0, 0]
         ^

repl.swift:9:5: note: found this candidate
    subscript(_ i: Int, _ j: Int) -> Double {
    ^

repl.swift:14:5: note: found this candidate
    subscript(_ i: Int, _ j: Int) -> Float {
    ^
您可以通过指定类型来消除歧义:

let x: Float = m[0, 0]

这正是我所担心的,可惜斯威夫特不支持二传,它没有意义