10-Swift下标脚本(Subscripts)

下标脚本可以定义在类、结构体和枚举中,即是访问集合、列表、学列的快捷方式,使用下标脚本的索引设置和获取值,不需要再调用实例特定的赋值和访问方法。


一、下标脚本语法


下标脚本允许通过实例方法后面的方括号传入一个或多个的索引值来对实例进行访问和赋值。语法类似于实例方法和计算属性的混合。与定义实例方法类似,定义下标脚本使用subscript关键字,显式声明入参和返回类型。与实例方法不同的是下标脚本可以设定为读写或只读,而这种方式类似计算属性的getter和setter:

class Student {
    // 学号
    var studentNumber:Int = 0;
    // 下标脚本
    subscript(index:Int) ->Int {
        get {
            // 返回与入参匹配的Int类型值
            // 例如学号: 11060101xxx
            return (11_060_101_000 + studentNumber);
        }
        set(newValue) { // newValue是默认的,也可以省略不写
            // 执行赋值操作
            studentNumber = newValue;
        }
    }
}
// 实例化
let student = Student();
// 下标脚本 - set
student[3] = 3;
// 下标脚本 - get
print("学号:\(student[3])");
输出结果:
学号:11060101003


二、下标脚本用法


例如,swift中字典的实现通过下标脚本来对其实例中存放的值进行存取操作。在下标脚本中使用和字典的索引类型的值,并把一个字典类型的值赋值给这个下标脚本:

var dict = ["num1":3, "num2":4, "num3":5, "num4":6, "num5":7];
// 设置字典的值
dict["num3"] = 13;
print(dict["num3"]!);
输出结果:
13

swift中字典的脚本实现中,在get部分返回值的可选类型的。例如上面代码,返回值是Int?,不是每个字典的索引都能得到一个整形值,对于没有设置值的索引访问返回的结果是nil,同样想删除字典中的某个索引对应的值,只需要给索引赋值为nil即可。


三、下标脚本选项


下标脚本允许任意数量的入参索引,并每个入参类型没有限制。类或结构体可以根据自身需要提供多个下标脚本实现,在定义下标脚本时通过入参的类型进行区分,使用下标脚本时会自动匹配合适的下标脚本运行,这即是下标脚本的重载:

/** 
 实现功能: 传入两个参数以及操作
*/
// 加减乘除枚举
enum ArithmeticSign {
    // 对应加减乘除
    case Add, Subtract, Multiply, Divide;
}

// 计算类
class ComputeClass {
    var value:Double = 0.0;
    
    // 计算方法
    func compute(num1:Double, num2:Double, sign:ArithmeticSign) -> Double {
        switch sign {
        case .Add:
            value = num1 + num2;
        case .Subtract:
            value = num1 - num2;
        case .Multiply:
            value = num1 * num2;
        case .Divide:
            value = num1 / num2;
        }
        return value;
    }
    
    // 下标脚本
    subscript(num1:Double, num2:Double, sign:ArithmeticSign) -> Double {
        get {
            value = compute(num1, num2: num2, sign: sign);
            return value;
        }
    }
}
// 实例对象
let compute = ComputeClass();
// 通过下标脚本获取获取对应的值
print("1 + 2 = \(compute[1,2,ArithmeticSign.Add])");
print("3 * 3 = \(compute[3,3,ArithmeticSign.Multiply])");
输出结果:
1 + 2 = 3.0
3 * 3 = 9.0


注:xcode7.3环境

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容

  • Swift属性 Swift属性将值跟特定的类,结构体,枚举关联。分为存储属性和计算属性,通常用于特定类型的实例。属...
    小小厨师阅读 822评论 0 0
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young阅读 3,757评论 1 10
  • 基础部分(The Basics) 当推断浮点数的类型时,Swift 总是会选择Double而不是Float。 结合...
    gamper阅读 1,243评论 0 7
  • 常量与变量使用let来声明常量,使用var来声明变量。声明的同时赋值的话,编译器会自动推断类型。值永远不会被隐式转...
    莫_名阅读 426评论 0 1
  • 官方文档 下标脚本 类,结构体和枚举可以定义下标脚本,下标脚本可以认为是访问集合(collection),列表或序...
    hrscy阅读 237评论 1 1