Swift 下标脚本
前言
在访问一个数组实例的元素时,可以使用
Array[index]的形式。在访问一个字典实例的元素时,可以使用Dictionary[index]的形式。这种方括号的形式就是 “下标脚本”。下标脚本就是对一个东西通过索引,快速取值的一种语法,在 Swift 中,我们可以在类(Class)、结构体(structure)和枚举(enumeration)中自己定义下标脚本的语法。
下标脚本允许你通过在实例后面的方括号中传入一个或者多个的索引值来对实例进行访问和赋值。
1、下标脚本的定义
下标脚本定义需要关键字
subscript,与计算属性类似,下标脚本需要指定参数类型和返回值的类型。其一般格式为subscript(参数名1: 参数类型, 参数名2: 参数类型, ...) -> 返回类型 { get {
// 返回类型声明中返回类型的值
} set(newValue) {
// 执行赋值操作
}
}
参数
- 参数也可以使用可变参数,但使用输入/输出(in-out)参数或和给参数设置默认值都是不允许的。
get 方法
- 在下表脚本中可以定义
get方法和set方法,其中set方法不是必须的。 - 如果下标脚本中没有写
set方法,则可以把get方法中的内容直接写到下标脚本的方法体中,从而省略外面的get{}。
- 在下表脚本中可以定义
set 方法
- 在下表脚本中可以定义
get方法和set方法,其中set方法不是必须的。 set方法有一个默认的参数newValue,用来表示传入的新值。- 即便不在参数列表中显示的写出
newValue,依旧可以在set方法中使用newValue。 - 可以在参数列表中写上其它名字以替换默认的参数名
newValue。
- 在下表脚本中可以定义
外部形参
和方法不同的是,无论你的下标脚本中有多少个参数,如果没有指定外部参数名,那么在调用的时候参数名称都是隐藏的,如果你觉得表义不够明确,则可以像方法那样加上外部参数名。
subscript(外部形参名1 本地形参名1: 参数类型, 外部形参名2 本地形参名2: 参数类型, ...) -> 返回类型 { get {
// 返回类型声明中返回类型的值
} set(newValue) {
// 执行赋值操作
}
}
2、下标脚本的使用
2.1 一般格式
下标脚本的用法非常灵活,下标脚本的定义中,参数的数量、类型和返回值都可以是任意的。
定义
struct myString { var str: String = "" subscript(start: Int, length: Int) -> String { get {
let startIndex = str.index(str.startIndex, offsetBy: start)
let endIndex = str.index(str.startIndex, offsetBy: start + length) return String(str[startIndex...endIndex])
} set {
str = newValue
}
}
}
使用
let str1 = myString(str: "hello world")
print(str1[0, 11]) // hello world let str2 = str1[2, 5]
print(str2) // llo w var str3 = myString()
str3[0, 0] = "world"
print(str3[0, 5]) // world
2.2 重载格式
下标脚本支持重载,在调用时根据参数的不同而调用不同的下标脚本方法。
定义
class Student1 { var scores: [Int] = Array(repeating: 0, count: 5) subscript(index: Int) -> Int { get {
return scores[index];
}
set {
scores[index] = newValue
}
} subscript(indexs: Int...) -> [Int] { get {
var values: [Int] = Array()
for index in indexs {
values.append(scores[index])
}
return values
}
set {
var i = 0
for index in indexs {
scores[index] = newValue[i]
i += 1
}
}
}
}
使用
let stu1 = Student1()
stu1[0] = 1
stu1[1] = 2 print("a[0]: \(stu1[0]), a[1]: \(stu1[1])") // a[0]: 1, a[1]: 2 let stu2 = Student1()
stu2[1, 2, 3] = [5, 6, 7] print(stu2[0, 1, 2, 3, 4]) // [0, 5, 6, 7, 0]
Swift 下标脚本的更多相关文章
- Swift—下标脚本(Subscripts)
下标脚本可以定义在类(Class).结构体(Struct).枚举(enumeration)这些目标中,可以认为是访问集合,列表或序列的快捷方式,使用下标脚本的索引设置和获取值,不需要再调用实例的特定的 ...
- Swift - 下标脚本方法介绍及实例
定义下标脚本之后,可以使用“[]”来存取数据类型的值. 示例1:实现一个我们自定的字符串类,可以方便的通过索引获取某一个字符值,或某一部分字符串.同时也可以通过索引,给某一部分赋值. 1 2 3 4 ...
- 5.Swift枚举|结构体|类|属性|方法|下标脚本|继承
1. 枚举: ->在Swift中依然适用整数来标示枚举值,需搭配case关键字 enum Celebrity{ case DongXie,XiDu,Nandi,BeiGai } // 从左 ...
- iOS - Swift Subscript 下标脚本
1.Subscript 下标脚本允许你通过在实例后面的方括号中传入一个或者多个的索引值来对实例进行访问和赋值.语法类似于实例方法和计算型属性的混合.与定义实例方法类似,定义下标脚本使用 subscri ...
- Swift枚举|结构体|类|属性|方法|下标脚本|继承
1. 枚举: ->在Swift中依然适用整数来标示枚举值,需搭配case关键字 enum Celebrity{ case DongXie,XiDu,Nandi,BeiGai } // 从左 ...
- Swift的属性,方法,下标脚本以及继承
从这篇章节起,Swift编程语言指南大部分的重要内容在于概念,代码并非太多.理解Swift的面向对象理念,语法以及类结构,构造析构过程对于非常好的应用Swift语言将会有比較大的帮助. 属性 存储属性 ...
- swift具体解释之八---------------下标脚本
swift具体解释之八-----下标脚本 下标脚本 能够定义在类(Class).结构体(structure)和枚举(enumeration)这些目标中.能够觉得是訪问对象.集合或序列的快捷方式.不须要 ...
- swift学习笔记之-下标脚本
//下标脚本subscript import UIKit /*下标脚本(Subscripts) 下标脚本: 1.可以定义在类(Class).结构体(structure)和枚举(enumeration) ...
- 下标脚本(Swift)
下标脚本 可以定义在类(Class).结构体(structure)和枚举(enumeration)这些目标中,可以认为是访问集合(collection),列表(list)或序列(sequence的快捷 ...
随机推荐
- 命令行下从bak文件恢复sqlserver数据库方法
命令行下从bak文件恢复sqlserver数据库方法 注:本文所示访问从SqlServer 2000 - 2014版都是通用的 参考:http://blog.sina.com.cn/s/blog_5c ...
- Ext JS isField为空或不是对象问题的解决
在做Ext Js的DataGrid的时候经常会遇到这种问题,火狐谷歌没有问题,IE8及以下版本就无法通过,经调试会提示: “isField为空或不是对象问题的解决” 这通常是我们在js代码中多加了一个 ...
- maven 配置篇 之pom.xml
http://www.blogjava.net/zyl/archive/2006/12/30/91055.html http://maven.apache.org/pom.html的翻译. m ...
- asp.net给文件分配自己主动编号,如【20140710-1】
在开发办公软件的时候,须要给非常多文件什么的东西分配一个编号.是依照日期来的,比方2014.07.10的第一个文件编号就为20140710-1,这一天的第二个文件编号就为20140710-2,以此类推 ...
- asp.net判断文件或文件夹是否存在
在上传文件时经常要判断文件夹是否存在,如果存在就上传文件,否则新建文件夹再上传文件 判断语句为 if (System.IO.Directory.Exists(Server.MapPath(" ...
- Sqlite和Mysql和SqlServer中insert … select … where not exist的用法
下面介绍Mysql和Sqlite和Sqlserver中,根据select的条件判断是否插入.例如: 一.Mysql中: INSERT INTO books (name) SELECT 'SongXin ...
- Centos7中firewalld防火锁墙的使用
一.服务控制 启动: systemctl start firewalld 查看状态: systemctl status firewalld 停止: systemctl disable firewal ...
- Plupload上传插件中文帮助文档
Plupload上传插件中文帮助文档 配置参数 实例化一个plupload对象时,也就是 new plupload.Uploader(),需要传入一个对象作为配置参数.后面内容中出现的plupload ...
- Go语言和ASP.NET的一般处理程序在处理WEB请求时的速度比较
Go语言和ASP.NET的一般处理程序在处理WEB请求时的速度比较 1.首先写一个Go语言的简单WEB程序,就返回一个HelloWord! package main import ( f " ...
- Webwork【01】Webwork与 Struct 的前世今生
Struts 1是全世界第一个发布的MVC框架,它由Craig McClanahan在2001年发布,该框架一经推出,就得到了世界上Java Web开发者的拥护,经过长达6年时间的锤炼,Struts ...