详解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

(0)

相关推荐

  • Swift教程之下标详解

    类,结构和枚举类型都可以通过定义下标来访问一组或者一个序列中的成员元素.通过下标索引就可以方便地检索和设置相应的值,而不需要其他的额外操作.比如你可以通过someArray[index]来访问数组中的元素,或者someDictionary[key]来对字典进行索引. 你可以为一个类型定义多个下标,以及适当的下标重载用来根据传递给下标的索引来设置相应的值.下标不仅可以定义为一维的,还可以根据需要定义为多维的,多个参数的. 1.下标语法 下标可以让你通过实例名后加中括号内一个或多个数值的形式检索一个

  • 详解Swift中的下标访问用法

    Swift中的Array,Dictionary类型可以通过下标或者键值的方式来进行数据的访问,实际上在Swift的语法中,下标可以定义在类.结构体.枚举中.开发者可以通过下标的方式来对属性进行访问而不用使用专门的存取方法.并且定义的下标不限于一维,开发者可以定义多维的下标来满足需求. 下标的语法结构 下标使用subscript来定义,其有些类似于方法,参数和返回值本别作为下标入参和通过下标所取的值.但是在subscript实现部分,又十分类似于计算属性,其需要实现一个get块和可选实现一个set

  • Swift 3.0基础学习之下标

    前言 类,结构体和枚举都可以定义下标,使用下标可以快速访问集合,列表或者序列的数据成员元素.可以使用someArray[index]来访问Array, 使用someDictionary[key]来访问Dictionary. 一个类型可以定义多个下标. 定义一个get set的下标: subscript(index: Int) -> Int { get { // return an appropriate subscript value here } set(newValue) { // perf

  • 详解Swift编程中下标的用法

    访问一个集合的元素成员,在类中的序列和列表,结构和枚举都可以使用下标.这些下标用于存储和使用索引来检索值.数组元素可使用如:someArray[index],在 Dictionary 实例及其后续成员元素的访问也可以使用如:someDicitonary[key]. 对于单一类型,下标范围可以从单一到多个声明.我们可以用适当的下标重载传递给下标索引值的类型.下标也可以根据输入数据类型声明范围从单一维度到多维度. 下标声明语法和用法 让我们回顾一下计算属性.下标也遵循计算属性相同的语法.对于查询类型

  • 详解Swift编程中的常量和变量

    常量 常量指的是程序无法在其执行期间改变的固定值. 常量可以是任何像整型常量,浮点常量,字符常量或字符串的基本数据类型.也可以是枚举常量. 这些常量和常规变量处理一样,只是它们的值不能在定义后进行修改. 声明常量 使用常量时,则必须使用关键字 let 声明它们如下: 复制代码 代码如下: let constantName = <initial value> 下面是一个简单的例子来说明如何在 Swift 中声明一个常量: 复制代码 代码如下: import Cocoa let constA =

  • 详解Swift编程中的方法与属性的概念

    方法 在 Swift 中特定类型的相关联功能被称为方法.在 Objective C 中类是用来定义方法,其中作为 Swift 语言为用户提供了灵活性,类,结构和枚举中可以定义使用方法. 实例方法 在 Swift 语言,类,结构和枚举实例通过实例方法访问. 实例方法提供的功能 访问和修改实例属性 函数关联实例的需要 实例方法可以写在花括号 {} 内.它隐含的访问方法和类实例的属性.当该类型指定具体实例它调用获得访问该特定实例. 语法 复制代码 代码如下: func funcname(Paramet

  • 详解Swift编程中的for循环的编写方法

    for 循环是一个循环控制结构,可以有效地编写来执行的特定次数的循环. 语法 for 循环在 Swift 编程语言的语法是: 复制代码 代码如下: for init; condition; increment{    statement(s) } 下面是在一个循环的流程控制: 初始化 init 步骤首先被执行,并且仅一次.在这一步,可以声明和初始化任何循环控制变量. 只要一个分号出现,不需要一定把一个语句放在这里. 接下来,计算条件.如果为真,则执行循环体.如果是假,循环体不执行,只是在 for

  • 详解python编程slice与indices函数用法示例

    一般来说,内置的slice()函数会创建一个切片对象,可以用在任何允许进行切片操作的地方. 下面是slice的简介: # slice 两种用法 class slice(stop) class slice(start, stop[, step]) 返回一个表示由 range(start, stop, step) 所指定索引集的 slice对象. 其中 start 和 step 参数默认为 None. 切片对象具有仅会返回对应参数值(或其默认值)的只读数据属性 start, stop 和 step.

  • 详解Swift中对C语言接口缓存的使用以及数组与字符串转为指针类型的方法

    详解Swift中对C语言接口缓存的使用以及数组与字符串转为指针类型的方法 由于Swift编程语言属于上层编程语言,而Swift中由于为了低层的高性能计算接口,所以往往需要C语言中的指针类型,由此,在Swift编程语言刚诞生的时候就有了UnsafePointer与UnsafeMutablePointer类型,分别对应为const Type*类型与Type *类型. 而在Swift编程语言中,由于一般数组(Array)对象都无法直接用于C语言中含有指针类型的函数参数(比如:void*),所以往往需要

  • 详解Shell编程之变量数值计算(二)

    OK,数值运算(上)是我看完的一小部分,大概的结束脚本如下:(回顾~~) #!/bin/bash a=$1 b=$2 expr $1 + 1 &>/dev/null if [ "$?" -ne "0" ] then echo "请输入数字" exit 1 fi if [ "$#" -ne "2" ] then echo "请输入两个数字" exit 1 fi echo &q

  • 详解Shell编程之变量数值计算(一)

    如果要执行运算,那就少不了运算符,和其他的编程语言相似,shell也有很多的运算符如下: +.-.:代表着加号 和减号 或者,负号 *./.%:代表着乘号,除号,和取模. **   : 幂运算 ++.-- :表示着增加或者减少,它可以放在前置,也可以放在变量的结尾 !.||.&&.(取反)(或) (and) <.<=.>.>=  :比较符号,小于.小于等于.大于.大于等于 ==.!=.= :相等,不相等, =表示相等于 <<     >> 

  • 详解shell 变量的高级用法示例

    变量删除和替换 案例:从头开始匹配,将符合最短的数据删除 (#) variable_1="I love you, Do you love me" echo $variable_1 variable_2=${variable_1#*ov} echo $variable_2 案例:从头开始匹配,将复合最短的数据删除(##) varible_3=${variable_1##*ov} echo $varible_3 案例:替换字符串,只替换第一次匹配成功的(/) echo $PATH var6

  • 详解Reactor中Context的用法

    目录 一.使用介绍 二.源码解读 三.如何桥接现有的ThreadLocal系统 四.总结 在响应式编程中,多线程异步性成为天然的内在,多线程之间的切换也成为原生的,在处理一个数据流Flux/Mono时,基本无法知道是运行在哪个线程上或哪个线程池里,可以说,每一个操作符operator以及内部的函数都可能运行在不同的线程上.这就意味着,以前用ThreadLocal来作为方法间透明传递共享变量的方式不再行得通.为此,Reactor提供了Context来替代ThreadLocal实现一个跨线程的共享变

随机推荐