我可以在Swift中定义一个方便的下标设置器吗?
例如,假设我:
extension Matrix {
subscript(_ i: Int, _ j: Int) -> Double {
get {
return value(atRow: i, column: j)
}
set {
setValue(newValue, row: i, column: j)
}
}
}我还想定义一个设置器,它接受浮点数,因为我厌倦了手动转换。我想做:
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)
}
}
}但是我不能这样做,因为第二个下标没有吸气器。
发布于 2017-06-20 00:31:10
由于Swift允许返回值重载(与Java和C++不同),所以可以添加Float 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) }
}
}但是,当您尝试在允许Float或Double的上下文中使用下标运算符时,会遇到麻烦。示例:
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]https://stackoverflow.com/questions/44641828
复制相似问题