Swift Expressible Literal

引子

从一个面试题说起。有如下代码:

struct Book {
let name: String
} let book: Book = "Charlotte's Web"

请问是否可以让它正常编译?

字面量

字面量指字面代表的常量值。这样解释起来有点像废话。但是通过例子就很容易理解了。

以下是 Swift 中的一些字面量:

种类 示例
字符串 "ich", Bingo!
浮点型数字 1001.3, 33.0
整型数字 1001, 33
布尔值 true, false
数组 ["Emily", "Ben", "Eric"]
字典 ["name": "Ben"]
nil

Expressible Literal 协议

Swift 中,String, Float, Double, IntBool 等类型,和上面的 Book 一样,都是 struct 。那么它们是怎么实现将字面量直接创建实例的呢?以下是 Bool 类型的一个拓展:

extension Bool : ExpressibleByBooleanLiteral {

    /// Creates an instance initialized to the specified Boolean literal.
///
/// Do not call this initializer directly. It is used by the compiler when
/// you use a Boolean literal. Instead, create a new `Bool` instance by
/// using one of the Boolean literals `true` or `false`.
///
/// var printedMessage = false
///
/// if !printedMessage {
/// print("You look nice today!")
/// printedMessage = true
/// }
/// // Prints "You look nice today!"
///
/// In this example, both assignments to the `printedMessage` variable call
/// this Boolean literal initializer behind the scenes.
///
/// - Parameter value: The value of the new instance.
public init(booleanLiteral value: Bool) /// A type that represents a Boolean literal, such as `Bool`.
public typealias BooleanLiteralType = Bool
}

再看看 Float 的一个拓展:

extension Float : ExpressibleByIntegerLiteral {

    /// Creates an instance initialized to the specified integer value.
///
/// Do not call this initializer directly. Instead, initialize a variable or
/// constant using an integer literal. For example:
///
/// let x = 23
///
/// In this example, the assignment to the `x` constant calls this integer
/// literal initializer behind the scenes.
///
/// - Parameter value: The value to create.
public init(integerLiteral value: Int64) /// A type that represents an integer literal.
///
/// The standard library integer and floating-point types are all valid types
/// for `IntegerLiteralType`.
public typealias IntegerLiteralType = Int64
}

除了 ExpressibleByBooleanLiteralExpressibleByBooleanLiteral 类似的协议还有 ExpressibleByStringLiteral, ExpressibleByNilLiteral, ExpressibleByArrayLiteral 等等。

所以,最开始的那个题目,就有答案了。

注意上面两个大代码块里面的注释,都有一句 Do not call this initializer directly

Swift Expressible literal的更多相关文章

  1. 浅谈Swift集合类型

    Swift 的集合表现形式由数组和字典组成.它可以完美的存储任何呢想存储的东西. 数组是一个同类型的序列化列表集合,它用来存储相同类型的不同值.字典也是一个数组,但它的存值方式类似于Map,通过一对一 ...

  2. 使用swift 中的注意,不断完善中

    1. 应该充分利用swfit的新特性 比如如果按照oc里的习惯,调用一个delegate中都optional函数应该这样写 if delegate != nil && delegate ...

  3. Apple Swift编程语言入门教程

    Apple Swift编程语言入门教程 作者: 日期: 布衣君子 2015.09.22 目录 1   简介 2   Swift入门 3   简单值 4   控制流 5   函数与闭包 6   对象与类 ...

  4. Swift声明参考

    一条声明可以在你的程序里引入新的名字和构造.举例来说,你可以使用声明来引入函数和方法,变量和常量,或者来定义 新的命名好的枚举,结构,类和协议类型.你也可以使用一条声明来延长一个已经存在的命名好的类型 ...

  5. Swift数据类型简介(二)

    整数 整数就是没有小数部分的数字,比如42和-23.整数可以是有符号(正.负.零)或者无符号(正.零). Swift 提供了8,16,32和64位的有符号和无符号整数类型.这些整数类型和 C 语言的命 ...

  6. swift中文文档翻译之--字符串和字符

    字符串和字符 A string is an ordered collection of characters, such as "hello, world" or "al ...

  7. swift中文文档- 类型转换

    未翻译完 待续(英语烂,求斧正) Type Casting 类型转换 Type casting is a way to check the type of an instance, and/or to ...

  8. swift:类型转换(is用作判断检测、as用作类型向下转换)

    类型转换是一种检查类实例的方式,并且哦或者也是让实例作为它的父类或者子类的一种方式.   类型转换在Swift中使用is 和 as操作符实现.这两个操作符提供了一种简单达意的方式去检查值的类型或者转换 ...

  9. Swift学习笔记五

    基础运算符 Swift的大部分运算符和C及OC相同,也分一元二元多元的,这里只记录一些Swift特有的性质或写法. 赋值运算符( = ) 在等号右边是一个有多个值的元组时,它的成员值可以分解并同时分别 ...

随机推荐

  1. github提交报错

    github正确提交步骤 https://www.cnblogs.com/alex-415/p/6912294.html 可能的错误 提交前没有先pull,主要的原因是在创建repository的时候 ...

  2. jieba尝鲜

    import jieba strings = '我工作在安徽的安徽师范大学,这个大学很美丽,在芜湖' # print(dir(jieba)) dic_strings = {} lst_strings ...

  3. 程序员面试:C/C++求职者必备 20 道面试题,一道试题一份信心!

    面试真是痛并快乐的一件事,痛在被虐的体无完肤,快乐在可以短时间内积累很多问题,加速学习. 在我们准备面试的时候,遇到的面试题有难有易,不能因为容易,我们就轻视,更不能因为难,我们就放弃.我们面对高薪就 ...

  4. Python创建一个爬虫项目===从零开始哟!想说的下次 要不要出一期关于pycharm与Python之间的合作

    当然,不用爬虫框架,也是可以的 比如说 beauitfulsoup xml http 就可以完美的得到一个爬虫的解决方案! 个人的意思是,新手或者刚入门的可以考虑以上的方式进行练习后 在使用框架 首先 ...

  5. 测试驱动开发学习笔记(UTDD)

    title: 测试驱动开发学习笔记(UTDD) date: 2020-08-01 23:59:17 tags: [2020, 学习一门技能, TDD, DevOps] What TDD(Test-Dr ...

  6. PHP+Redis链表解决高并发下商品超卖问题

    目录 实现原理 实现步骤 上一篇文章聊了一下使用Redis事务来解决高并发商品超卖问题,今天我们来聊一下使用Redis链表来解决高并发商品超卖问题. 实现原理 使用redis链表来做,因为pop操作是 ...

  7. 解放双手!用 Python 控制你的鼠标和键盘

    在工作中难免遇到需要在电脑上做一些重复的点击或者提交表单等操作,如果能通过 Python 预先写好相关的操作指令,让它帮你操作,然后你自己去刷网页打游戏,岂不是很爽?] 很多人学习python,不知道 ...

  8. QT QMdiArea 添加背景或添加背景图片失效问题

    说起QMdirArea 这个控件与其他控件真所不同.... 这里记一下 我踩过的坑之一,,,,, QMdiArea 默认的背景 不符合我要求,,当时我就理所当然就想往常一样给它设置颜色 万万没想到.. ...

  9. C#设计模式之19-观察者模式

    观察者模式(Observer Pattern) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/423 访问. 观察者模式 ...

  10. C#LeetCode刷题之#414-第三大的数(Third Maximum Number)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3710 访问. 给定一个非空数组,返回此数组中第三大的数.如果不存 ...