1. 类型安全和类型推测

 1> 类型安全  

  Swift 是一个 _类型安全(type safe)_ 的语言。类型安全的语言可以让你清楚地知道代码要处理的值的类型。如果你的代码需要一个`String`,你绝对不可能不小心传进去一个`Int`。

  由于 Swift 是类型安全的,所以它会在编译你的代码时进行 _类型检查(type checks)_ ,并把不匹配的类型标记为错误。这可以让你在开发的时候尽早发现并修复错误。

  当你要处理不同类型的值时,类型检查可以帮你避免错误。然而,这并不是说你每次声明常量和变量的时候都需要显式指定类型。

 2> 类型推测

  如果你没有显式指定类型,Swift 会使用 _类型推测(type inference)_ 来选择合适的类型。有了类型推测,编译器可以在编译代码的时候自动推测出表达式的类型。原理很简单,只要检查你赋的值即可。

  因为有类型推测,和 C 或者 Objective-C 比起来 Swift 很少需要声明类型。常量和变量虽然需要明确类型,但是大部分工作并不需要你自己来完成。

  当你声明常量或者变量并赋初值的时候类型推测非常有用。当你在声明常量或者变量的时候赋给它们一个_字面量(literal value 或 literal)_ 即可触发类型推测。(字面量就是会直接出现在你代码中的值,比如`42`和`3.14159`。)

  ① 如果你给一个新常量赋值`42`并且没有标明类型,Swift 可以推测出常量类型是`Int`,因为你给它赋的初始值看起来像一个整数:

   let meaningOfLife = 42

   // meaningOfLife 会被推测为 Int 类型

  ② 如果你没有给浮点字面量标明类型,Swift 会推测你想要的是`Double`:

     let pi = 3.14159

   // pi 会被推测为 Double 类型

   当推测浮点数的类型时,Swift 总是会选择`Double`而不是`Float`。

  ③ 如果表达式中同时出现了整数和浮点数,会被推测为`Double`类型:

   let anotherPi = 3 + 0.14159

   // anotherPi 会被推测为 Double 类型

   原始值`3`没有显式声明类型,而表达式中出现了一个浮点字面量,所以表达式会被推测为`Double`类型。

2. 数值型字面量

 1> 整数字面量可以被写作:

  * 一个十进制数(decimal),没有前缀

  * 一个二进制数(binary),前缀是`0b`

  * 一个八进制数(octal),前缀是`0o`

  * 一个十六进制数(hexadecimal),前缀是`0x`

  例: 下面的所有整数字面量的十进制值都是`17`:

   let decimalInteger = 

   let binaryInteger = 0b10001       // 二进制的17

   let octalInteger = 0o21           // 八进制的17

   let hexadecimalInteger = 0x11     // 十六进制的17

 2> 浮点数字面量

  ① 浮点字面量可以是十进制(没有前缀)或者是十六进制(前缀是`0x`)。小数点两边必须有至少一个十进制数字(或者是十六进制的数字)。

  ② 浮点字面量还有一个可选的 _指数(exponent)_ ,在十进制浮点数中通过大写或者小写的`e`来指定,在十六进制浮点数中通过大写或者小写的`p`来指定。

   如果一个十进制数的指数为`exp`,那这个数相当于 基数和$10^{exp}$的乘积:

    * `1.25e2` 表示 $1.25 × 10^{2}$,等于 `125.0`。

    * `1.25e-2` 表示 $1.25 × 10^{-2}$,等于 `0.0125`。

   如果一个十六进制数的指数为`exp`,那这个数相当于 基数和$2^{exp}$的乘积:

    * `0xFp2` 表示 $15 × 2^{2}$,等于 `60.0`。

    * `0xFp-2` 表示 $15 × 2^{-2}$,等于 `3.75`。

   例: 下面的这些浮点字面量都等于十进制的`12.1875`:

      let decimalDouble = 12.1875

      let exponentDouble = 1.21875e1

      let hexadecimalDouble = 0xC.3p0

 3> 额外的格式

  数值类字面量可以包括额外的格式来增强可读性。整数和浮点数都可以添加额外的零并且包含下划线,并不会影响字面量:

   let paddedDouble = 000123.456

   let oneMillion = 1_000_000

   let justOverOneMillion = 1_000_000.000_000_1

3. 类型别名

 _类型别名(type aliases)_ 就是给现有类型定义另一个名字。你可以使用`typealias`关键字来定义类型别名。

 当你想要给现有类型起一个更有意义的名字时,类型别名非常有用。假设你正在处理特定长度的外部资源的数据:

  typealias AudioSample = UInt16

 定义了一个类型别名之后,你可以在任何使用原始名的地方使用别名:

  var maxAmplitudeFound = AudioSample.min

  // maxAmplitudeFound 现在是 0

  本例中,`AudioSample`被定义为`UInt16`的一个别名。因为它是别名,`AudioSample.min`实际上是`UInt16.min`,所以会给`maxAmplitudeFound`赋一个初值`0`。

04_Swift2基础之类型安全和类型推测+字面量+类型别名的更多相关文章

  1. TS数据类型:类型别名/联合类型/字面量类型/类型推论等纲要

    在学C/C++  Java等强类型语言时,变量类型是唯一的,需要先指定.PHP JavaScript等弱类型语言时,无需指定变量类型 但是,TypeScript里面的联合类型 (Union Type) ...

  2. Typescript 字符串字面量类型

    字符串字面类型定义的类型是固定的,在其使用时必须是其定义的其中一个字符串,否则会报错 当传入一个定义之外的字符串时,会报错字符串字面量类型.ts(13,20): error TS2345: Argum ...

  3. Scala 基础(7)—— 函数字面量和一等函数

    1. 函数字面量 在 Scala 基础(3)—— 基础类型和基础操作 中提到了函数字面量,这里具体解释函数字面量的语法. 下面展示一个具体的函数字面量,它由三部分组成: (x: Int, y: Int ...

  4. 【Go入门教程2】基本构成元素:标识符(identifier)、关键字(keyword 25个)、字面量(literal)、分隔符(delimiter)、和 操作符(operator)

    基本构成要素 Go 的语言符号 又称 词法元素,共包括 5 类内容——标识符(identifier).关键字(keyword).字面量(literal).分隔符(delimiter) 和 操作符(op ...

  5. java的数据类型、自动拆装箱、字面量

    java 中的数据类型分为两大类:值类型(基本数据类型)和引用类型(复合数据类型)  值类型分为 1,整数类型(byte,short,int,long) 2,浮点类型(float,double) 3, ...

  6. java基本数据类型的字面量

    java的基本数据类型一共有8种.其中:(每种类型后面列出了java中的该类型的字面量) 四种整型: int  4字节: 12  +12  -12  077 0xFF  0b101(JDK7中支持的二 ...

  7. python 3.3.3 字面量,正则,反斜杠和原始字符串

    两个不起眼但是比较重要的设定 Python str类型的字面量解释器 当反斜杠及其紧接字符无法构成一个具有特殊含义的序列('recognized escape sequences')时,Python选 ...

  8. 前端-JavaScript1-3——JavaScript之字面量

    字面量?????? 字面量:英语叫做literals,有些书上叫做直接量.看见什么,它就是什么. 我们先来学习数字的字面量,和字符串的字面量.剩余的字面量类型,我们日后遇见再介绍. 3.1 数字的字面 ...

  9. 4.GDscript(2)关键字,运算符,字面量

    (来源godot官方文档) 关键词 下面是该语言支持的关键字列表.由于关键字是保留字(令牌),它们不能用作标识符.操作符(如 in , not , and 或 or )以及下面列出的内置类型的名称也是 ...

随机推荐

  1. 将rabbitmq整合到Spring中手动Ack

    如果要手动ack,需要将Listener container 的 acknowledge 设置为manul,在消费消息的类中需实现ChannelAwareMessageListener接口. over ...

  2. hadoop namenode ha--手动切换(转)

    1.hadoop的dfs.nameservices如何配置?2.集群配置中hdfs://mycluster的作用是什么?3.如何将namenode2切换为active状态? 在参考本手册前请确保Had ...

  3. MyBatis魔法堂:即学即用篇

    一.前言                   本篇内容以理解MyBatis的基本用法和快速在项目中实践为目的,遵循Make it work,better and excellent原则. 技术栈为My ...

  4. Feature hashing相关 - 1

    考虑典型的文本分类,一个经典的方法就是     分词,扫描所有特征,建立特征词典 重新扫描所有特征,利用特征词典将特征映射到特征空间编号 得到特征向量 学习参数 w 存储学习参数 w , 存储特征映射 ...

  5. Kl 证明 凸函数

    回到随机变量传输问题,假设传输中我们不知道具体 分布情况(unknown),我们用一个已知的分布 ,来模拟它,那么在这种情况下如果我们利用 尽可能高效的编码,那么我们平均需要多少额外的信息量来描述x呢 ...

  6. 重温WCF之WCF传输安全(十三)(4)基于SSL的WCF对客户端采用证书验证(转)

    转载地址:http://www.cnblogs.com/lxblog/archive/2012/09/20/2695397.html 前一篇我们演示了基于SSL的WCF 对客户端进行用户名和密码方式的 ...

  7. 解决Pyqt打包后运行报错:应用程序无法启动 因为程序的并行配置不正确

    做了一个生成二维码的小程序:http://www.cnblogs.com/dcb3688/p/4241048.html 直接运行脚本没问题,用pyinstaller打包后再运行就直接报错了: 应用程序 ...

  8. 【翻译一】java-并发

    Lesson: Concurrency Computer users take it for granted that their systems can do more than one thing ...

  9. 在python多进程中使用manager和Barrier

    注意:Barrier是PYTHON3才有的功能,在2中无法测试. #!/usr/bin/env python # -*- coding: utf-8 -*- import multiprocessin ...

  10. Linux中exec()执行文件系列函数的使用说明

    函数原型: 描述:    exec()系列函数使用新的进程映像替换当前进程映像.    工作方式没有什么差别, 只是参数传递的方式不同罢了. 说明:    1. 这6个函数可分为两大类: execl( ...