• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Swift:下标

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

下标选项

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

类或结构体可以根据自身需要提供多个下标实现,合适被使用的下标会基于值类型或者使用下标时下标方括号里包含的值来推断。这个对多下标的定义就是所谓的下标重载

通常来讲下标接收一个形式参数,但只要你的类型需要也可以为下标定义多个参数。如下例定义了一个 Matrix 结构体,它呈现一个Double 类型的二维矩阵。 Matrix 结构体的下标接收两个整数形式参数:

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

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.0, count: rows * columns)

    }

    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 * columns) + column] = newValue

        }

    }

}

Matrix 提供了一个接收 rows 和 columns 两个形式参数的初始化器,创建了一个足够容纳 rows * columns 个数的 Double 类型数组。矩阵里的每个位置都用 0.0 初始化。要这么做,数组的长度,每一格初始化为 0.0 ,都传入数组初始化器来创建和初始化一个正确长度的数组。这个初始化器在使用默认值创建数组里有更详细的描述。

你可以通过传入合适的行和列的数量来构造一个新的 Matrix 实例:

 

1

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

上例中创建了一个新的两行两列的 Matrix 实例。 Matrix 实例中的数组grid 是 矩阵的高效扁平化版本,阅读顺序从左上到右下:

矩阵里的值可以通过传行和列给下标来设置,用逗号分隔:

 

1

2

matrix[0, 1] = 1.5

matrix[1, 0] = 3.2

上面两条语句调用的下标的设置器来给矩阵的右上角( row 是 0 , column 是 1 )赋值为 1.5 ,给左下角( row 是 1 ,column 是 0 )赋值为 3.2 :

 

Matrix 下标的设置器和读取器都包含了一个断言来检查下标的 row 和 column 是否有效。为了方便进行断言, Matrix 包含了一个名为 indexIsValidForRow(_:column:) 的成员方法,它用来确认请求的 row 或 column 值是否会造成数组越界:

 

1

2

3

func indexIsValidForRow(row: Int, column: Int) -> Bool {

    return row >= 0 && row < rows && column >= 0 && column < columns

}

断言在下标越界时触发:

 

1

2

let someValue = matrix[2, 2]

// this triggers an assert, because [2, 2] is outside of the matrix bounds

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Swift:超炫的View Controller切换动画发布时间:2022-07-13
下一篇:
Swift经典排序算法-归并排序法发布时间:2022-07-13
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap