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. T4模板

    T4,即4个T开头的英文字母组合:Text Template Transformation Toolkit. T4文本模板,即一种自定义规则的代码生成器.根据业务模型可生成任何形式的文本文件或供程序调 ...

  2. 线程变量ThreadLocal的使用

    我们有时候会通过token进行多次查询(猪:token是redis中的key),比如: 一次是在登录拦截器中,一次是在controller的业务中查询,这样存在性能和资源的浪费问题!!! 那么如何将拦 ...

  3. Rabbitmq实现负载均衡与消息持久化

      Rabbitmq 是对AMQP协议的一种实现.使用范围也比较广泛,主要用于消息异步通讯. 一,默认情况下Rabbitmq使用轮询(round-robin)方式转发消息.为了较好实现负载,可以在消息 ...

  4. C++联合

    原文地址:http://ideage.javaeye.com/blog/210614 联合(union)在C/C++里面见得并不多,但是在一些对内存要求特别严格的地方,联合又是频繁出现,那么究竟什么是 ...

  5. NYOJ题目893十字架

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAsYAAAQRCAIAAACl4dlPAAAgAElEQVR4nO3dO1Ljyv834P8myFkIsR

  6. UVA 10405最长公共子序列

    裸最长公共子序列,直接贴代码 #include<cstdio> #include<iostream> #include<algorithm> #include< ...

  7. MVC – 6.控制器 Action方法参数与返回值

      6.1 Controller接收浏览器数据   a.获取Get数据 : a1:获取路由url中配置好的制定参数: 如配置好的路由: 浏览器请求路径为: /User/Modify/1 ,MVC框架获 ...

  8. Python 自然语言处理(1) 计数词汇

    Python有一个自然语言处理的工具包,叫做NLTK(Natural Language ToolKit),可以帮助你实现自然语言挖掘,语言建模等等工作.但是没有NLTK,也一样可以实现简单的词类统计. ...

  9. SQL SERVER 索引之聚集索引和非聚集索引的描述

    索引是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度. 索引包含由表或视图中的一列或多列生成的键. 这些键存储在一个结构(B 树)中,使 SQL Server 可以快速有效地查找与键值关 ...

  10. wp8 入门到精通 ImageCompress 图片压缩

    //实例化选择器 PhotoChooserTask photoChooserTask = new PhotoChooserTask(); BitmapImage bimg; int newPixelW ...