第12章:下标

作者: 行知路 | 来源:发表于2019-02-19 09:20 被阅读1次

  下标操作符在许多语言中都用于数组元素的访问,在Objective-C中下标还用于字典的访问,在Swift中下标操作符除了可以在数组、字典两个集合之中使用外,还支持自定义下标运算符——可以在枚举、结构体、类中定义下标运算符,从而实现自己想要的功能。自定义下标运算符的维数不受限制,可以根据需要自定义。

个人理解
此功能在某些场景下很有用,但是此种场景不多,完全可以使用实例方法实现该功能,只是在极少场景下不太优美。

12.1 下标语法

  下标使你可以通过在实例名称后面的方括号中写入一个或多个值来查询类型的实例。它们的语法类似于实例方法语法和计算属性语法。使用subscript关键字编写下标定义,并以与实例方法相同的方式指定一个或多个输入参数和返回类型。与实例方法不同,下标可以是读写或只读。此行为由getter和setter以与计算属性相同的方式传递:


// 下标定义语法

subscript(index: Int) -> Int {
    get {
        // return an appropriate subscript value here
    }

    // 类型newValue与下标的返回值相同。
    // 与计算属性一样,可以选择不指定setter的(newValue)参数。
    // newValue如果您没有自己提供,则会为您的setter提供一个默认参数。
    set(newValue) {
        // perform a suitable setting action here
    }
}

// 与只读计算属性一样,可以通过删除get关键字及其大括号来简化只读下标的声明:
subscript(index: Int) -> Int {
    // return an appropriate subscript value here
}

// 这是一个只读下标实现的示例,它定义了一个TimesTable表示n次整数表的结构:
struct TimesTable {
    let multiplier: Int
    subscript(index: Int) -> Int {
        return multiplier * index
    }
}
let threeTimesTable = TimesTable(multiplier: 3)
print("six times three is \(threeTimesTable[6])")
// Prints "six times three is 18"

12.2 下标用法

下标的类型可以是字符串等类型,不一定必须是整数;
下标也可以返回任何类型;
下标可以使用可变参数,但它们不能使用输入输出参数或提供默认参数值。

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
        }
    }
}

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

matrix[0, 1] = 1.5
matrix[1, 0] = 3.2

相关文章

  • 第12章:下标

      下标操作符在许多语言中都用于数组元素的访问,在Objective-C中下标还用于字典的访问,在Swift中下标...

  • 深度学习-从感知机到反向传播

    1 单层感知机 1.1 单层单输出 下标的说明: 1、X上标表示所在层数, X下标表示每层的第#个元素。 2、W上...

  • swift 下标(下标语法、下标用法)

    类、结构体和枚举都可以定义下标,下标是用于访问集合、列表或序列的成员元素的快捷方式。可以使用下标,设置和获取值,而...

  • 插入排序

    第5行先判断j是否大于等于0防止切片下标越界

  • 顺序存储二叉树

    顺序存储二叉树特点 只考虑完全二叉树 第n个元素的左子节点 下标 2*n+1 第n个元素的右子节点 下标 2*n...

  • 下标

    本页包含内容: [TOC] 下标可以定义在类、结构体和枚举中,是访问集合、列表和序列中元素的快捷方式,可以使用下标...

  • 下标

    扩展一个数组的的下标, 传入一个下标的数组,返回这些下标对应的元素的数组 extension Array{ sub...

  • 下标

  • 下标

    下标(subscript) 使用subscript可以给任意类型(枚举、结构体、类)增加下标功能,有些地方也翻译为...

  • LeetCode 剑指 Offer II 088. 爬楼梯的最少

    题目 数组的每个下标作为一个阶梯,第 i 个阶梯对应着一个非负数的体力花费值 cost[i](下标从 0 开始)。...

网友评论

    本文标题:第12章:下标

    本文链接:https://www.haomeiwen.com/subject/uwztyqtx.html