详解Swift编程中下标的用法

访问一个集合的元素成员,在类中的序列和列表,结构和枚举都可以使用下标。这些下标用于存储和使用索引来检索值。数组元素可使用如:someArray[index],在 Dictionary 实例及其后续成员元素的访问也可以使用如:someDicitonary[key]。

对于单一类型,下标范围可以从单一到多个声明。我们可以用适当的下标重载传递给下标索引值的类型。下标也可以根据输入数据类型声明范围从单一维度到多维度。

下标声明语法和用法
让我们回顾一下计算属性。下标也遵循计算属性相同的语法。对于查询类型的实例下标括在方括号内,接着是实例名称。下标语法遵循结构作为 “实例方法” 和 “计算属性” 相同的语法。“subscript” 关键字用来定义标,用户可以指定一个或多个参数,它们带有返回类型。下标可以有读写或只读属性和实例存储和检索使用 “getter” 和 “setter” 属性作为计算属性。

语法


subscript(index:Int)->Int{get{// used for subscript value declarations}set(newValue){// definitions are written here}}


示例1

struct subexample {let decrementer:Int

    subscript(index:Int)->Int{return decrementer / index

    }}let division = subexample(decrementer:100)

println("The number is divisible by \(division[9]) times") println("The number is divisible by \(division[2]) times") println("The number is divisible by \(division[3]) times") println("The number is divisible by \(division[5]) times") println("The number is divisible by \(division[7]) times")


当我们使用 playground 运行上面的程序,得到以下结果

The number is divisible by 11 times
The number is divisible by 50 times
The number is divisible by 33 times
The number is divisible by 20 times
The number is divisible by 14 times

示例2


class daysofaweek {privatevar days =["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","saturday"]

    subscript(index:Int)->String{get{return days[index]}set(newValue){self.days[index]= newValue

        }}}var p = daysofaweek()

println(p[0]) println(p[1]) println(p[2]) println(p[3])


当我们使用 playground 运行上面的程序,得到以下结果

Sunday
Monday
Tuesday
Wednesday

下标选项
下标采用单一到多元的输入参数,这些输入参数也属于任意数据类型。还可以使用变量,可变参数的参数。下标不能提供缺省参数值,或使用任何 in-out 参数。

定义多个标被称为“下标重载'在一个类 或结构体根据需要可以提供多个下标定义。这些多个标是基于被下标括号内声明值的类型推断。


structMatrix{let rows:Int, columns:Intvarprint:[Double]

    init(rows:Int, columns:Int){self.rows = rows

        self.columns = columns

        print=Array(count: rows * columns, repeatedValue:0.0)}

    subscript(row:Int, column:Int)->Double{get{returnprint[(row * columns)+ column]}set{print[(row * columns)+ column]= newValue

        }}}var mat =Matrix(rows:3, columns:3)

mat[0,0]=1.0 mat[0,1]=2.0 mat[1,0]=3.0 mat[1,1]=5.0

println("\(mat[0,0])") println("\(mat[0,1])") println("\(mat[1,0])") println("\(mat[1,1])")


当我们使用 playground 运行上面的程序,得到以下结果

1.0
2.0
3.0
5.0

Swift 下标支持单参数到多参数声明相应数据类型。该程序声明的“矩阵”结构为2*2维数组矩阵来存储 “Double” 数据类型。 矩阵参数被输入整数数据类型用来声明行和列。

矩阵新实例是通过使行和列数来初始化创建的,如下所示。


 var mat = Matrix(rows: 3, columns: 3) 


矩阵值可通过传递行和列值到下标,通过逗号隔开,进行定义如下所示。


mat[0,0] = 1.0  

mat[0,1] = 2.0

mat[1,0] = 3.0

mat[1,1] = 5.0


下标方法的定义
下标方法的定义语法与实例方法和计算属性的语法类似。
       下标方法使用subscript关键字来指示是一个下标方法。与实例方法一样,下标方法定义中可以规定一个或多个输入参数,并带有一个返回类型。与实例方法不同的是下标方法可以是可读写的或是只读的。与计算属性的定义一样,下标方法通过使用getter和setter来传达下标方法的行为。如果在下标方法的定义中getter和setter都被指定,则定义了一个可读写的下标方法,如果下标方法的定义中不包含setter,则定义了一个只读的下标方法,并且这时代表getter方法的关键字get也可以省略。下标方法定义的完整语法如下:


subscript(index:Int) ->Int {

   get {

       // return an appropriate subscript value here

    }

   set(newValue) {

       // perform a suitable setting action here

    }

}

     该例定义了一个可读写的下标方法,newValue可以指定,也可以不指定,不指定时使用默认的参数名newValue。

     如下例子展示了一个只读下标方法的定义和使用。由于只读下标方法只指定一个getter,意义是明确的,因此可以省略get关键字。

struct TimesTable {

   let multiplier:Int

   subscript(index:Int) ->Int {

       return multiplier *index

    }

}

let threeTimesTable =TimesTable(multiplier:3)

println("six times three is\(threeTimesTable[6])")

// prints "six times three is 18”


下标方法的使用 
        你能为一个类型定义和实现多个下标方法,编译器基于你传送给下标方法的索引参数的类型来推断和选择适当的下标方法。
        与方法类似,下标方法可以包含任意数量的输入参数,且这些输入参数的类型可以是任何类型,下标方法也能返回任何类型。下标方法也能使用可变参数,但不能使用in-out参数也不能通过默认参数值。
                  如可以定义一个带有多个输入参数的表示多纬度的下标方法,下面的例子展示了如何为一个矩阵结构定义一个带两个整数类型的下标方法以及如何使用,定义的下标方法用来索引矩阵中定义的两纬度的元素。

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)

    }

 subscript(row:Int,column:Int) ->Double {

       get {

         

           return grid[(row *columns) +column]

        }

       set {

       

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

        }

    }

}

     

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

matrix[0,1] =1.5

matrix[1,0] =3.2