首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >快捷方便下标

快捷方便下标
EN

Stack Overflow用户
提问于 2017-06-20 00:20:11
回答 1查看 65关注 0票数 0

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

例如,假设我:

代码语言:javascript
复制
extension Matrix {
  subscript(_ i: Int, _ j: Int) -> Double {
    get {
      return value(atRow: i, column: j)
    }
    set {
      setValue(newValue, row: i, column: j)
    }
  }
}

我还想定义一个设置器,它接受浮点数,因为我厌倦了手动转换。我想做:

代码语言:javascript
复制
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)
    }
  }
}

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-20 00:31:10

由于Swift允许返回值重载(与Java和C++不同),所以可以添加Float getter:

代码语言:javascript
复制
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) }
    }
}

但是,当您尝试在允许FloatDouble的上下文中使用下标运算符时,会遇到麻烦。示例:

代码语言:javascript
复制
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 {
    ^

可以通过指定类型来消除歧义:

代码语言:javascript
复制
let x: Float = m[0, 0]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44641828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档