Swift开篇010->下标

PART_ONLY 下标(subscript)

  1. 简介

    • 下标可定义在类、结构体、枚举中,是访问集合、列表、序列元素的快捷方式
  2. 语法格式

    • 下标了设定为读写或只读

      // 读写
      subscript(index: Int) -> Int {
          get {
            // 返回一个适当的 Int 类型的值
          }
      
      	// newValue 类型与下标返回类型相同
          set(newValue) {
            // 执行适当的赋值操作
          }
      }
      
      // 只读
      subscript(index: Int) -> Int {
          // 返回一个适当的 Int 类型的值
      }
      
  3. 演示

    struct TimesTable {
        let multiplier: Int
        
        // 只读的下标
        subscript(index: Int) -> Int {
            return multiplier * index
        }
    }
    
    let threeTimesTable = TimesTable(multiplier: 3)
    // threeTimesTable[6] 的值为 18
    
  4. 下标用法举例(Dictionary)

    • 本例通过下标返回将可选类型(Int?)

    • 通过下标删除键对应的值:将键对应的值赋值为 nil 即可

      var animals = ["spider": 8, "ant": 6, "cat": 4]
      // 通过下标插入新的键值对
      animals["bird"] = 2
      
  5. 下标选项

    • 下标可接受任意数量、类型的入参,下标的返回值也可是任意类型

    • 下标可使用变量入参和可变参数,但不能用输入输出参数,也不能给参数设置默认值

    • 类或结构体可提供多个下标实现,使用时通过入参的数量和类型自动匹配

    • 下为矩形结构体的案例

      struct Matrix {
          // 行列
          let rows: Int, columns: Int
          // 根据行列,得到数组值
          var grid: [Double]
          
          init(rows: Int, columns: Int) {
              self.rows = rows
              self.columns = columns
              
              grid = Array(count: rows * columns, repeatedValue: 0.0)
          }
          
          // 角标越界判断
          func indexIsValidForRow(row: Int, column: Int) -> Bool {
              return row >= 0 && row < rows && column >= 0 && column < columns
          }
          
          // 下标
          subscript(row: Int, column: Int) -> Double {
              get {
                  assert(indexIsValidForRow(row, column: column), "Index out of range")
                  return grid[(row * columns) + column]
              }
              set {
                  assert(indexIsValidForRow(row, column: column), "Index out of range")
                  grid[(row * columns) + column] = newValue
              }
          }
      }
      
      // 构造 2*2 的矩阵实例
      var matrix = Matrix(rows: 2, columns: 2)
          
      matrix[0, 1] = 1.5 // 赋值
      matrix[1, 0] = 3.2 // 赋值
          
      let someValue = matrix[2, 2]
      // 越界:断言触发
      
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值