这是我参与更文挑战的第13天,活动详情查看: 更文挑战
下标定义
Swift中的Array或Dictionary类型可以通过下标或者键值对的方式来进行数据的访问。实际上在Swift的语法中,下标可以定义在类、结构体和枚举中,可以通过下标的方式来对属性进行访问而不用使用专门的存取方法。对于定义的下标不限于一维,可以定义多维的下标来满足需求。
下标语法
- 
下标使用关键字 subscript修饰,有些类似于方法,参数和返回值作为下标入参和通过下标获取的值。在subscript的实现部分,类似计算属性,需要实现getter方法和可选的setter方法,getter方法用于通过下标取值,setter方法用于通过下标设置值。下标语法看起来像计算属性和方法的混合体。subscript(index: Int) -> Int { get { // 返回一个适当的 Int 类型的值 } set(newValue) { // 执行适当的赋值操作 } } 复制代码
- 
通过 getter方法实现只读的下标访问,与只读计算属性类似,可以通过删除getter关键字及其大括号来简化只读下标的声明class stringsOfText { var strArr = ["A", "B", "C", "D"] subscript(index: Int) -> String { return strArr[index] } } var str = stringsOfText() var string = str.strArr[1]; print(string) log: B 复制代码
- 
通过 getter方法和setter方法实现的下标读写class Student { var name = "" var age = ""; var hobby = "" subscript(index: Int) -> String { get { switch index { case 0: return(name) case 1: return(age) case 2: return(hobby) default: return "\(index)" } } set(newValue) { switch index { case 0: name = newValue case 1: age = newValue case 2: hobby = newValue default: print(newValue) } } } } var student = Student() student[0] = "li lei" student[1] = "18" student[2] = "play football" print("姓名:\(student.name)") print("年龄:\(student.age)") print("爱好:\(student.hobby)") log: 姓名:li lei 年龄:18 爱好:play football 复制代码
下标选项
Swift中的下标可以自定参数个数和参数类型,返回数据的类型也可以进行自定义。但是有一点需要注意,下标的参数不能设置默认值,也不能设置为in-out类型
class SectionAndRow {
    
  var array:Array<Array<Int>> = [[1,2],
                                 [3,4],
                                 [5,6],
                                 [7,8]]
    
  subscript(section:Int,row:Int)->Int{
    get{
      let temp = array[section]
      return temp[row]
    }
  }
}
var data = SectionAndRow()
//通过二维下标取值
var value = data[2,1]
print(value)
log:
6
复制代码类型下标
- 类型下标:定义在类型本身上调用的下标。
- 类型下标语法:可以把在static关键字放置在subscript之前用来表示类型下标。如果是类可以使用class关键字代替static,以允许子类覆盖超类对该下标的实现
class Student {
    static var name = ""
    static var age = "";
    
    class subscript(index: Int) -> String {
        get {
            if index == 0 {
                return(name)
            }else{
                return(age)
            }
        }
        set(newValue) {
            if index == 0 {
                name = newValue
            }else{
                age = newValue
            }
        }
    }
}
Student[0] = "li lei"
Student[1] = "18"
print("姓名:\(Student.name)")
print("年龄:\(Student.age)")
log:
姓名:li lei
年龄:18
复制代码© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
    























![[桜井宁宁]COS和泉纱雾超可爱写真福利集-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/4d3cf227a85d7e79f5d6b4efb6bde3e8.jpg)

![[桜井宁宁] 爆乳奶牛少女cos写真-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/d40483e126fcf567894e89c65eaca655.jpg)
