本篇分为两部分:

一、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开发第七篇——字面量转换&下标的更多相关文章

  1. Swift语言指南(五)--数字字面量和数字类型转换

    原文:Swift语言指南(五)--数字字面量和数字类型转换 数字字面量 整数字面量写法如下: · 十进制数,无前缀 · 二进制数,以 0b 为前缀 · 八进制数,以 0o 为前缀 · 十六进制数,以 ...

  2. Swift开发第十篇——可变参数函数&初始化方法顺序

    本篇分为两部分: 一.Swift中的可变参数函数 二.初始化方法的顺序 一.Swift中的可变参数函数 可变参数函数指的是可以接受任意多个参数的函数,在 OC 中,拼接字符串的函数就属于可变参数函数 ...

  3. Swift开发第八篇——方法嵌套&命名空间

    本篇分为两部分: 一.Swift中的方法嵌套 二.Swift中的命名空间 一.Swift中的方法嵌套 在 swift 中我们可以让方法嵌套方法,如: func appendQuery(var url: ...

  4. Swift开发第六篇——操作运算符也可以重载& func 的参数修饰

    本篇分为两部分: 1.Swift 中重载操作运算符的使用 2.Swfit 中 func 的参数修饰 1.Swift 中重载操作运算符的使用 与别的语言不同,Swift 支持运算符的重载,运算符指的是“ ...

  5. Swift开发第五篇——四个知识点(Struct Mutable方法&Tuple&autoclosure&Optional Chain)

    本篇分三部分: 一.Struct Mutable方法 二.多元组(Tuple) 的使用 三.autoclosure 的使用 四.Optional Chain 的使用 一.Struct Mutable方 ...

  6. Swift开发第十一篇——Designated、Convenience和Required

    本篇主要讲解 Swift 中 Designated.Convenience和 Required 的使用: 在 OC 中 init 方法是非常不安全的,没人能够保证 init 只被调用一次,也没有人保证 ...

  7. Swift开发第四篇——柯里化

    本篇分为两部分: 一.柯里化的基本使用 二.柯里化的使用场景 一.柯里化的基本使用 柯里化(Currying):也就是把接受多个参数的方法变换成接受第一个参数的方法,并且返回接受余下的参数并且返回结果 ...

  8. PowerBI开发 第七篇:数据集和数据刷新

    PowerBI报表是基于数据分析的引擎,数据真正的来源(Data Source)是数据库,文件等数据存储媒介,PowerBI支持的数据源类型多种多样.PowerBI Service(云端)有时不直接访 ...

  9. Swift开发第三篇——Playground

    本篇分为两部分: 一.Playground的延时运行 二.Playground的可视化 一.Playground的延时运行 Playground 就是提供一个可以即时编译的类似 REPL 的环境,他为 ...

随机推荐

  1. LeetCode - Pascal's Triangle II

    题目: Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3, Return ...

  2. 【UWP】FlipView绑定ItemsSource,Selectedindex的问题

    最近在做列表头部的Carousel展示,Carousel使用的是FlipView展示,另外使用ListBox显示当前页,如下图 我们先设置一个绑定的数据源 public class GlobalRes ...

  3. easyui combobox 值怎样获取

    $('#com').combobox('getValue')获取当前选中的值$('#com').combobox('getText')获取当前选中的文字

  4. 创建Oracle数据库

    [root@localhost ~]# su - oracle [oracle@localhost ~]$ sqlplus /nolog SQL> conn /as sysdba; SQL> ...

  5. Asp.net中使用Server.HtmlDecode(string str)的使用

    前言: 在使用Visual Studio开发web页面时,需要在GridView中绑定Table数据,并加入了CommandField, 试图,点击详情按钮是,获取GridView中Rows中Cell ...

  6. JAVA中的输入方法

    输入整数(int)类型 导入包 import java.io.*; 输入语句 BufferedReader myIn=new BufferedReader(new inputStreamReader( ...

  7. php中的字符串常用函数(五) explode 妙用

    // 示例 2 $data = "foo:*:1023:1000::/home/foo:/bin/sh" ; list( $user , $pass , $uid , $gid , ...

  8. 使用PhpStrom等IDE编辑 远程linux服务器上的文件 实时更新

    习惯了在linux上 vim进行PHP的开发,突然忘了IDE的感觉,所以想到了.通过PhpStrom等IDE直接编辑 samba共享到 mac或者windows本地的磁盘进行编辑. 为了忘却的纪念,有 ...

  9. Java程序运行时,数据都保存到什么地方?

    程序运行时,我们最好对数据保存到什么地方做到心中有数.特别要注意的是内存的分配.有六个地方都可以保存数据: 寄存器 这是最快的保存区域,因为它位于和其他所有保存方式不同的地方:处理器内部.然而,寄存器 ...

  10. Release编译模式下,事件是否会引起内存泄漏问题初步研究

    题记:不常发生的事件内存泄漏现象 想必有些朋友也常常使用事件,但是很少解除事件挂钩,程序也没有听说过内存泄漏之类的问题.幸运的是,在某些情况下,的确不会出问题,很多年前做的项目就跑得好好的,包括我也是 ...