swift 下标定义与使用

1,319 阅读2分钟

这是我参与更文挑战的第13天,活动详情查看: 更文挑战

下标定义

Swift中的ArrayDictionary类型可以通过下标或者键值对的方式来进行数据的访问。实际上在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