Swift-下标-subscript

 

import UIKit

 

//数组和字典的取值都是用的下标

//可以自定义下标的具体实现

//可以为类、结构体和枚举定义下标

//下标的形参和返回值都是可以任意类型的。

//下标可以使用变量参数和可变参数,但不能使用输入输出参数

//===下标语法===

/*

subscript(index:Int) -> Int {

   get{

        //返回与形参匹配的Int类型值

   }

   set(newValue){

        //执行赋值操作

   }

}

*/

 

//=====列子=====

struct TimesTable {

   let multiplier: Int

   subscript(index: Int) -> Int{

       return multiplier * index

    }

}

let threeTimesTable = TimesTable(multiplier:3)

let answer = threeTimesTable[6] //返回18

 

//--------下标的重载-----------

struct Matrix {

   let rows: Int, columns: Int

   var grid: [Double]

   init(rows: Int, columns: Int) {

       self.rows = rows

       self.columns = columns

       grid = [Double](count: rows * columns, repeatedValue: 0.0)

        //或者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: row, column:column), "Index out ofrange")

           return grid[(row * columns) + column]

       }

       set{

           assert(indexIsValidForRow(row: row, column:column), "Index out ofrange")

           grid[(row * columns) + column] = newValue

       }

    }

   subscript(row: Int) -> Double{

       get{

           assert(indexIsValidForRow(row: row, column: 1), "Index out of range")

           return grid[(row * columns) + 1]

       }

       set{

           assert(indexIsValidForRow(row: row, column: 1), "Index out of range")

           grid[(row * columns) + 1] = newValue

       }

    }

}

var matrix = Matrix(rows: 2, columns: 2)

matrix[0, 1] = 1.5

matrix[1, 0] = 3.2

matrix[1] = 4.4   //使用重载下标方法

matrix

 

class Person {

   var age: Int

   var base: Double

   init(age: Int, base: Double){

       self.age = age

       self.base = base

    }

   subscript(age: Int) -> Double {

       get{

           switch age {

               case 0...20 : return 1.5 * base

               case 21...35 : return 2.5 * base

               case 36...45 : return 3.5 * base

               default : return 4 * base

               }

       }

       set{

           base = newValue

       }

    }

}

 

let person = Person(age: 25, base: 5000)

person[33//返回2.5*5000

person[43//返回3.5*5000

person[43]=10000

person[50//返回4*10000

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值