Swift学习- 下标脚本(十二)


/*

下标脚本 可以定义在类(Class)、结构体(structure)和枚举(enumeration)这些目标中,

可以认为是访问集合(collection),列表(list)或序列(sequence的快捷方式,使用下标脚本的索引设置和获取值,

不需要再调用实例的特定的赋值和访问方法。  像数组someArray[index],字典someDirectionary[key]一样。

对于同一个目标可以定义多个下标脚本,通过索引值类型的不同来进行重载,下标脚本不限于单个纬度,

你可以定义多个入参的下标脚本满足自定义类型的需求。

定义下标脚本使用subscript关键字,显式声明入参(一个或多个)和返回类型。

与实例方法不同的是下标脚本可以设定为读写或只读。这种方式又有点像计算型属性的gettersetter

subscript(index:Int) -> Int {

    get {

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

    }

    set(newValue) {

        // 执行赋值操作

    }

}

newValue的类型必须和下标脚本定义的返回类型相同。与计算型属性相同的是set的入参声明newValue就算不写,

set代码块中依然可以使用默认的newValue这个变量来访问新赋的值。

与只读计算型属性一样,可以直接将原本应该写在get代码块中的代码写在subscript中:

“get{}”省略不写

subscript(index: Int) -> Int {

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

}

*/

struct TimesTable {

    let multiplier:Int

    subscript(index:Int) -> Int {

        return multiplier * index

    }

}

let threeTimesTable = TimesTable(multiplier: 3)

print("36倍是 \(threeTimesTable[6])")

//36倍是 18


/*

下标脚本用法

根据使用场景不同下标脚本也具有不同的含义。通常下标脚本是用来访问集合(collection),

列表(list)或序列(sequence)中元素的快捷方式。你可以在你自己特定的类或结构体中自由的实现下标脚本来提供合适的功能。

*/


//定义矩阵

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

            

        }

    }

}


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

matrix[0,1] = 1.5

matrix[1,0] = 3.2

print(matrix.grid)//[0.0, 1.5, 3.2, 0.0]


//let someValue = matrix[2,2]

//print(someValue) //下标越界 抛出错误


//脚本重载的例子,通过不同的参数来区分

struct CountNum {

    var row:Int, col:Int

    subscript(num:Int) ->Int {

      return row + col + num

    }

//    重载

    subscript(num:Int, repeatCount:Int) -> Int {

        return (row + col + num ) * repeatCount

    }

}


var someCount = CountNum(row: 5, col: 5)

print(someCount[2]//12

print(someCount[2,10]) //120


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值