Swift4 基础部分: Subscripts

本文是学习《The Swift Programming Language》整理的相关随笔,基本的语法不作介绍,主要介绍Swift中的一些特性或者与OC差异点。

系列文章:

Classes, structures, and enumerations can define 
subscripts, which are shortcuts for accessing the member 
elements of a collection, list, or sequence. You use 
subscripts to set and retrieve values by index without 
needing separate methods for setting and retrieval.
  • 类,结构体和枚举中可以定义下标,可以认为是访问对象、集合或序列的快捷方式,不需要再调用实例的单独的赋值和访问方法。

下标语法(Subscript Syntax)

我们直接来看一下例子:

struct TimeaTable{
    let multiplier: Int
    subscript(index: Int) -> Int {
        return multiplier * index
    }
}

let threeTimesTable = TimeaTable(multiplier: 3);
print("six times three is \(threeTimesTable[6])");

执行结果:

six times three is 18

下标选项(Subscript Options)

Subscripts can take any number of input parameters, and 
these input parameters can be of any type. Subscripts can 
also return any type. Subscripts can use variadic 
parameters, but they can’t use in-out parameters or 
provide default parameter values. 
  • 下标允许任意数量的入参,每个入参类型也没有限制。下标的返回值也可以是任何类型。下标可以使用变量参数可以是可变参数,但不能使用写入读出(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(repeating:0, count: columns*rows);
    }
    func indexIsValidForRow(_ row: Int, _ column: Int) -> Bool {
        return row >= 0 && row < rows && column >= 0 && column < columns;
    }
    subscript(_ row: Int, _ column: Int) -> Double {
        get {
            assert(indexIsValidForRow(row,column), "Index out of range");
            return grid[(row * columns) + column];
        }
        set {
            assert(indexIsValidForRow(row,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;
print("matrix \(matrix.grid)");

执行结果:

matrix [0.0, 1.5, 3.2, 0.0]
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young阅读 9,396评论 1 10
  • 常量与变量使用let来声明常量,使用var来声明变量。声明的同时赋值的话,编译器会自动推断类型。值永远不会被隐式转...
    莫_名阅读 3,255评论 0 1
  • Swift属性 Swift属性将值跟特定的类,结构体,枚举关联。分为存储属性和计算属性,通常用于特定类型的实例。属...
    小小厨师阅读 4,350评论 0 0
  • 感赏儿子完成一天的补课任务,儿子辛苦了。回来状态不错,希望他的学习状态也越来越好,很专注的玩游戏,也很快乐很...
    金色阳光魏艳春阅读 1,352评论 0 0
  • 宝贝,深夜的此刻,妈妈对你的想念满满地挤占了整颗心,满溢得无处安放。 短短三天的欢聚,狠狠地解了之前1...
    木槿篱笆阅读 2,720评论 0 0