Swift开发第七篇——字面量转换&下标
本篇分为两部分:
一、Swift 中的字面量转换
二、Swift 中的下标
一、Swift 中的字面量转换
所谓字面量就是指像特定的数字,字符串或者是布尔值这样能够直接了当地指出自己的类型并未变量进行赋值的值。比如下面三个都称为字面量:
let aNumber =
let astring = "Hello"
let aBool = true
在 Swift 中,Array 和 Dictionary 在使用简单的描述赋值的时候,使用的也是字面量,比如:
let anArray = [,,]
let aDictionary = ["key1": "value1", "key2": "value2"]
Swift为我们提供了一组非常有意思的接口,用来将字面量转换为特定的类型。对于那些实现了字面量转换接口的类型,在提供字面量赋值的时候,就可以简单的按照接口方法中定义的规则“无缝对应”的通过赋值的方式将值转换为对应类型。这些接口包括了各个原声的字面量,在实际开发中我们经常可能用到的有:
ArrayLiteralConvertible
BooleanLiteralConvertible
DictionaryLiteralConvertible
FloatLiteralConvertible
NilLiteralConvertible
IntegerLiteralConvertible
StringLiteralConvertible
点进去看可以发现所有的字面量转换接口都定义了一个 typealias 和对应的 init 方法。
protocol BooleanLiteralConvertible {
typealias BooleanLiteralType init(booleanLiteral value: BooleanLiteralType)
}
在 Swift 标准库中, typealias BooleanLiteralType = Bool
于是我们可以重写系统的 init 方法来自定义我们自己的类型,比如自定义自己的 Bool 类型:
enum MyBool: Int {
case myTrue, myFalse
} extension MyBool: BooleanLiteralConvertible {
init(booleanLiteral value: Bool) {
self = value ? myTrue : myFalse
}
} class test: UIViewController { override func viewDidLoad() {
super.viewDidLoad() let myTrue: MyBool = true
let myFalse: MyBool = false print(myTrue.rawValue) // 输出结果:0
print(myFalse.rawValue) // 输出结果:1
}
}
该段代码在 playground 中很难调试出来,在 swift 中比较直观。
注意:字面量是一个强大的特性,同时又是一个比较隐蔽的特性,所以在目前的实际工作中可读性并不好,也就是说同事可能不知道你写的是什么。
二、Swift 中的下标
在一个数组中,我们要取出 index 为0,2,3的元素的时候,现有的体系会比较吃力,需要枚举数组,然后循环判断是否是我们想要的位置。这里更好的做法是可以实现一个接受数组作为下标输入的读取方法:
extension Array {
subscript(input: [Int]) -> ArraySlice<Element> {
get {
var result = ArraySlice<Element>()
for i in input {
assert(i < self.count, "Index out of range")
result.append(self[i])
}
return result
}
set {
for (index, i) in input.enumerate() {
assert(i < self.count, "Index out of range")
self[i] = newValue[index]
}
}
}
} // 实例化一个数组
var arr = [,,,,]
// 取出索引为0,2,3的数组中的值
arr[[,,]]
// 重新改变索引为0,2,3的数组的值
arr[[,,]] = [-,-,-]
// 改变后的数组中的值
arr
输出结果为:
Swift开发第七篇——字面量转换&下标的更多相关文章
- Swift语言指南(五)--数字字面量和数字类型转换
原文:Swift语言指南(五)--数字字面量和数字类型转换 数字字面量 整数字面量写法如下: · 十进制数,无前缀 · 二进制数,以 0b 为前缀 · 八进制数,以 0o 为前缀 · 十六进制数,以 ...
- Swift开发第十篇——可变参数函数&初始化方法顺序
本篇分为两部分: 一.Swift中的可变参数函数 二.初始化方法的顺序 一.Swift中的可变参数函数 可变参数函数指的是可以接受任意多个参数的函数,在 OC 中,拼接字符串的函数就属于可变参数函数 ...
- Swift开发第八篇——方法嵌套&命名空间
本篇分为两部分: 一.Swift中的方法嵌套 二.Swift中的命名空间 一.Swift中的方法嵌套 在 swift 中我们可以让方法嵌套方法,如: func appendQuery(var url: ...
- Swift开发第六篇——操作运算符也可以重载& func 的参数修饰
本篇分为两部分: 1.Swift 中重载操作运算符的使用 2.Swfit 中 func 的参数修饰 1.Swift 中重载操作运算符的使用 与别的语言不同,Swift 支持运算符的重载,运算符指的是“ ...
- Swift开发第五篇——四个知识点(Struct Mutable方法&Tuple&autoclosure&Optional Chain)
本篇分三部分: 一.Struct Mutable方法 二.多元组(Tuple) 的使用 三.autoclosure 的使用 四.Optional Chain 的使用 一.Struct Mutable方 ...
- Swift开发第十一篇——Designated、Convenience和Required
本篇主要讲解 Swift 中 Designated.Convenience和 Required 的使用: 在 OC 中 init 方法是非常不安全的,没人能够保证 init 只被调用一次,也没有人保证 ...
- Swift开发第四篇——柯里化
本篇分为两部分: 一.柯里化的基本使用 二.柯里化的使用场景 一.柯里化的基本使用 柯里化(Currying):也就是把接受多个参数的方法变换成接受第一个参数的方法,并且返回接受余下的参数并且返回结果 ...
- PowerBI开发 第七篇:数据集和数据刷新
PowerBI报表是基于数据分析的引擎,数据真正的来源(Data Source)是数据库,文件等数据存储媒介,PowerBI支持的数据源类型多种多样.PowerBI Service(云端)有时不直接访 ...
- Swift开发第三篇——Playground
本篇分为两部分: 一.Playground的延时运行 二.Playground的可视化 一.Playground的延时运行 Playground 就是提供一个可以即时编译的类似 REPL 的环境,他为 ...
随机推荐
- [Asp.net]通过uploadify将文件上传到B服务器的共享文件夹中
写在前面 客户有这样的一个需求,针对项目中文档共享的模块,客户提出如果用户上传特别的大,或者时间久了硬盘空间就会吃满,能不能将这些文件上传到其他的服务器?然后就稍微研究了下这方面的东西,上传到网络中的 ...
- 序列不包含任何元素,c#,支付宝
序列不包含任何元素 我的是代码原因,由于访问数据库取出数据为空列表,然而我并没有判断列表是否为空,直接取First,所以才会有这个提示 解决方案:先判断列表是否为空,再取值,如果为空,要给商品名称赋默 ...
- MVC的路径查找顺序
使用MVC的朋友们,知道MVC的funny之处. 但是如果出现路径找不到,请记住以下的页面路径寻找顺序. http://www.cnblogs.com/sosoft/ 首先,知道你的Controlle ...
- WIN-CE系统架构
WIN-CE 系统架构分为素部分:硬件层.OEM 层.操作系统层.应用层 http://hovertree.com/hvtart/bjae/oy9pqb94.htm 硬件层: 由CPU .存储器.I/ ...
- 15天玩转redis —— 第三篇 无敌的列表类型
据说60%的人使用redis看重的是redis中的list类型,那这个list有什么用呢???不用我说大家都明白,做队列使用呗,为什么用它呢,很简单呗, 因为有了它我就不需要专门的MQ产品啦,比如说 ...
- "Hello World!" for the NetBeans IDE
"Hello World!" for the NetBeans IDE It's time to write your first application! These detai ...
- Microsoft.Practices.Unity入门
Unity是微软Patterns & Practices团队所开发的一个轻量级的,并且可扩展的依赖注入(Dependency Injection)容器,它支持常用的三种依赖注入方式:构造器注入 ...
- 容器--EnumMap
一.概述 EnumMap是一类特殊的Map, 其特殊之处在于KEY需要是枚举类型,由于枚举类型的特点是值的个数是固定的,所以,对于EnumMap来说,其所能存储的个数也就是固定的了.这种类型的Map相 ...
- 使用Spring的@Scheduled实现定时任务
Spring配置文件xmlns加入xmlns:task="http://www.springframework.org/schema/task"xsi:schemaLocation ...
- Atom + activate-power-mode震屏插件Windows7下安装
Atom是Github推出的一个文本编辑器,搜索一下大概是给Web前端用的,最近比较火的是他的一个插件activate-power-mode,可以实现打字屏振效果. 用来装装逼还是挺适合的,本来想试试 ...