swift下标脚本和extension扩展

Easter79
• 阅读 342

一.类的下标方法

类、结构体和枚举可以定义下标,它可以作为访问集合、列表或序列成员元素的快捷方式。可使用下标通过索引值来设置或检索值而不需要为设置和检索分别使用实例方法。
可以为一个类型定义多个下标,并且下标会基于传入的索引值的类型选择合适的下标重载使用。下标没有限制单个维度,你可以使用多个输入形参来定义下标以满足自定义类型的需求。

下标脚本允许通过在实例名后面的方括号内写一个或多个值对该类的实例进行查询。它的语法类似于实例方法和计算属性。使用关键字subscript来定义下标,并且指定一个或多个输入形式参数和返回类型,与实例方法一样。与实例方法不同的是,下标可以是读写也可以是只读的。  

//下标方法
struct Matrix {
    let rows: Int
    let columns: Int
    var grid: [Double]
    init(row: Int, cloumns: Int) {
        self.rows = row
        self.columns = cloumns
        grid = Array(repeating: 0.0, count: row * cloumns)
    }
    subscript(row: Int, cloumns: Int) -> Double {
        get {
            return grid[row * cloumns + cloumns]
        }
        set {
            grid[row * cloumns + cloumns] = newValue
        }
    }
}

var matrix = Matrix(row: 2, cloumns: 2)
matrix[1, 0] = 9.9
matrix[0, 1] = 8.8
print(matrix) //输出:Matrix(rows: 2, columns: 2, grid: [9.9, 8.8, 0.0, 0.0])
print(matrix[1, 0]) //输出:9.9

二.extension扩展结构体、枚举、类
扩展为现有的类、结构体、枚举类型、或协议添加了新功能。这也包括了为无访问权限的源代码扩展类型的能力。扩展和 Objective-C 中的 category 类似。
1.添加计算实例属性和计算类型属性(扩展不能添加存储属性,因为类被实例化后,内存空间是确定了,添加存储属性需要内存空间,会改变原有的内存结构。类比OC的分类不能添加实例变量、属性
2.定义实例方法和类型方法
3.提供新初始化器
4.定义下标
5.定义和使用新内嵌类型
6.使现有的类型遵循某协议
7.扩展可以向一个类型添加新的方法,但是不能重写已有的方法

//扩展,添加计算属性
extension Double {
    var km: Double {
        return self / 1000.0
    }
}

//添加方法
extension Int {
    func repeatTask(task: ()->()) {
        for _ in 0..<self {
            task()
        }
    }
}

4.repeatTask {
    print("nihao")
}

//扩展下标
extension Int {
    subscript(digitIndex: Int) -> Int {
        get {
            var base = 1
            for _ in 0..<digitIndex {
                base *= 10
            }
            return (self / base) % 10
        }
    }
}

//扩展内嵌函数
extension Int {
    enum Kind {
        case zero
        case negative
        case positivw
    }
    var kind: Kind {
        get {
            switch self {
            case 0:
                return .zero
            case let x where x > 0 :
                return .negative
            default:
                return .positivw
            }
        }
    }
}

print(0.kind)
点赞
收藏
评论区
推荐文章
桃浪十七丶 桃浪十七丶
3年前
C++写一个简单排序算法
分析算法步骤:1、暂定元素排列第0个为最小值,下标为min;2、然后从左往右依次扫描,与min的关键字比较,若比min的更小,则更新min下标为当前下标;3、并且把先前的最小值与当前找到目标的元素交换位置。cinclude<iostreamusingnamespacestd;voidSwap(int&a,int&b)inttem
陈占占 陈占占
2年前
python 字典
字典(dict):以键值对的方式存在,以大括号为标志、在字典里面键是不能修改的,值可以修改语法格式:字典名{key1:value1,key2:value2,.......}note:是无序的类型,建必须唯一,值不必。索引是以键为下标,不能索引键对应的值,键不能为列表特点:1.键值之间必须用冒号(:)隔开2.项与项之间必须用逗号(,)隔开3.字典中的键必须
Wesley13 Wesley13
2年前
PTA1
11数组定义中,数组名后是用方括号括起来的常量表达式,不能用圆括号。(1分)\T\F12在C语言中能逐个地使用下标变量,也能一次引用整个数组。(1分)T\F\因为它有首地址13同一个数组中的每个元素都具有相同的数据类型,有统一的标识符即数组名,用不同的序号即下标来区分数组中的各元素。(1分)\T\F14数
Stella981 Stella981
2年前
IOS开发:Swift中附属脚本的使用说明
附属脚本,说白了就是下标,就是类似数组(Array)的someArray\index\或字典(Dictionary)的someDictionary\key\这种用法。Swfit把这种功能开放了出来,使得我们自定义的类、结构体、枚举也能有这样的功能。这种特性可以让我们非常方便的来访问某些变量。接下里我们举个例子来说明它的用法。class
Wesley13 Wesley13
2年前
JS 获取数组某个元素下标 函数方法
/获取某个元素下标arrays:传入的数组obj:需要获取下标的元素/functioncontains(arrays,obj){variarrays.length;w
Easter79 Easter79
2年前
Swift讲解专题十三——下标访问
Swift讲解专题十三——下标访问一、引言      在以前的博客中,讨论过在ObjectiveC中,通过下标的方式访问自定义数据模型的方法。ObjectiveC中主要是通过实现一系列方法来使自定义的数据类型支持下标的访问方式,博客地址如下:在ObjectiveC中使用下标访问自定义数据模型:
Wesley13 Wesley13
2年前
JavaSE
DAY081.数组1.1定义数组是相同类型数据的有序集合。数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。其中,每一个数据称作一个元素,每个元素可以通过一个索引(下标)来访问它们。数组的三个基本特点:1.长度是确定的。数组一旦被创建,它的大小就是不可以改变的。2.其元素必须
Easter79 Easter79
2年前
Swift专题讲解十四——继承
Swift专题讲解十四——继承一、引言      Swift中,一个类可以从另一个类继承方法、属性、下标及其他特性。当一个类继承于另一个类时,这个类被称为子类,所继承的类被称为父类。在Swift中,继承是类区别于其他类型的主要特征。子类除了可以调用父类的属性,下标,方法外,其也可以对父类的属性,下标,方法进
Wesley13 Wesley13
2年前
Java基础语法:数组
一、简介描述:数组是相同类型数据的有序集合。其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们。基本特点:1.数组的长度是确定的。数组一旦被创建,它的大小就是不可以改变的。2.数组元素必须是相同类型,不允许
Stella981 Stella981
2年前
Python基础(三)
1.listlist是一种可变的有序容器,每个元素都拥有自己的下标.列表使用\\定义.(1)定义方法x1,2,3第一种,使用yx第二种,赋值ylist({1,2,3})第三种,使用强制转换函数(2)下标下标从0开始,允
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k