swift 下标 subscript

类、结构体、和枚举可以定义下标。它可以作为访问集合,列表或序列成员元素的快捷方式。你可以使用下标通过索引值来设置或检索值而不需要为设置和检索分别使用实例方法。

你可以作为一个类型定义多个下标,并且下标会基于传入的索引值的类型选择合适的下标重载使用,下标没有限制单个纬度,你可以使用多个输入形参来定一下标以满足自定义类型的需求。

下标脚本允许你通过在实例名后面方括号内写一个或多值对该类的实例进行查询。它的语法类似于实例方法和计算属性,使用关键字subscript来定义下标,并且指定一个或多个输入形式参数和返回类型,与实例方法一样,与实例方法不同的是,下标可以是读写也可以是只读的

//: A UIKit based Playground for presenting user interface

import UIKit


struct TimesTable {
    let multiplier:Int
    subscript(index :Int)-> Int{
        return multiplier * index
    }
}


let threeTimesTable = TimesTable(multiplier: 3)
print("six times three is \(threeTimesTable[6])")

six times three is 18

下标参数

下标可以接受任意数量的输入形式参数,并且这些输入形式参数可以是任意类型。下标也可以返回任意类型,下标可以使用变量形式参数和可变形式参数,但是不能使用输入输出形式参数,或提供默认形式参数。

//: A UIKit based Playground for presenting user interface

import UIKit

struct Matrix{
    let rows:Int,columns:Int
    var grid:[Double]
    init(rows:Int,columns:Int){
        self.rows=rows
        self.columns=columns
        grid=Array(repeating:0, count: rows*columns)
        print(grid)
    }
    
    func indexIsValid(row:Int,column:Int) -> Bool {
        return row >= 0 && row < rows && column >= 0 && column < columns
    }
    subscript(row:Int,column:Int)->Double{
        get {
            assert(indexIsValid(row: row, column: column),"Index out of range")
            return grid[(row * columns) + column]
        }
        
        set {
            assert(indexIsValid(row: row, column: column),"Index out of range")
            grid[(row * column)+column] = newValue
            
        }
    }
}
var matrix = Matrix(rows: 2,columns: 2)
matrix[0,1]=1.5
matrix[1,0]=3.2
print(matrix)

[0.0, 0.0, 0.0, 0.0]

Matrix(rows: 2, columns: 2, grid: [3.2, 1.5, 0.0, 0.0])

 

类型下标

static subscript

实例下标,如果上文描述的那样,你在对应类型的实例上调用下标。你同样也可以定义类型本身的下标。这类下标叫做类型下标,

在类里则使用class 关键字,这样可以允许子类重写父类的下标实现

//: A UIKit based Playground for presenting user interface

import UIKit

enum Planet:Int{
    case mercury = 1,venus,earth,mars,jupiter,strun,uranus,neptune
    static subscript(n:Int)->Planet{
        return Planet(rawValue: n)!
    }
}
let mars = Planet[4]
print(mars)

mars

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安果移不动

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值