Swift语言指南(五)--数字字面量和数字类型转换
数字字面量
整数字面量写法如下:
· 十进制数,无前缀
· 二进制数,以 0b 为前缀
· 八进制数,以 0o 为前缀
· 十六进制数,以 0x 为前缀
下面所有整数字面量值为十进制的 17 :
let decimalInteger = 17
let binaryInteger = 0b10001 // 17 二进制标识
let octalInteger = 0o21 // 17 八进制标识
let hexadecimalInteger = 0x11 // 17 十六进制标识
浮点数字面量可以是二进制(无前缀)或十六进制(以 0x 为前缀),小数点的两侧必须有各有一个数字(或十六进制数字)。他们都可以拥有一个可选的指数幂,十进制小数标记为大写或小写的 e ,十六进制标记为大写或小写的 p 。
指数幂为 exp 的十进制数字,它的基数将乘以 10exp :
· 1.25e2 表示 1.25 × 102, 或 125.0.
· 1.25e-2 表示 1.25 × 10-2, 或 0.0125.
指数幂为 exp 的十六进制数字,它的基数将乘以 2exp:
· 0xFp2 表示 15 × 22, 或 60.0.
· 0xFp-2 表示 15 × 2-2, 或 3.75.
下面所有浮点数的字面值为十进制值 12.1875:
let decimalDouble = 12.1875
let exponentDouble = 1.21875e1
let hexadecimalDouble = 0xC.3p0
数字字面量可以包含其它的格式以便于阅读。整数与浮点数均可以添加多余的零或下划线以提高可读性。两种格式均不会影响字面量的实际值:
let paddedDouble = 000123.456
let oneMillion = 1_000_000
let justOverOneMillion = 1_000_000.000_000_1
数字类型转换
代码中应使用 Int 类型作为所有常规用途的整数常量及变量的类型,即使它们的确为非负数。日常使用中,使用默认的整数类型意味着这些整型常量与变量均可即时互相参与运算,并可与根据整数字面值推断出的类型相匹配。
仅当手中的任务必须使用其他整数类型时才用它们,如外部数据源提供宽度明确的数据,或为了性能、内存占用等其他必需优化的情况考虑。在这些情况下使用宽度明确的类型有助于发现偶然的数值溢出和捕捉使用时数据的原始信息。
整数转换
不同数字类型所能存储的值域范围是不同的。一个 Int8 常量或变量能存储 -128 到 127 之间的数字,而一个 UInt8 常量或变量能存储 0 到 255 的数字。无法存进一个整型的常量或变量的数字编译时会报错:
let cannotBeNegative: UInt8 = -1
// UInt8 不能保存负数, 所以这里会报错的
let tooBig: Int8 = Int8.max + 1
// Int8 不能保存超过其最大值范围的数字,
// 所以这里也会报错的
由于不同数据类型能存储的值域不同,在进行数据转换时需要具体问题具体对待。这种实际选择的过程可避免隐式转换的问题,还能在代码中强化类型转换的意图。
要将一个数字的类型转换为另一种,应先把现有值初始化一个所需类型的新的数字。下例中,常量 twoThousand 的类型为 UInt16,而常量 one 的类型为 UInt8。它们无法直接相加,因为类型不同。因此,本例将调用 UInt16(one) 新建一个 UInt16 数,并将 one 的数值初始化,用初始化的新值(新值为 UInt16 )取代原始值(原始值为 UInt8 ):
let twoThousand: UInt16 = 2_000
let one: UInt8 = 1
let twoThousandAndOne = twoThousand + UInt16(one)//将常量one初始化为UInt16
现在加号两侧均为 UInt16 类型,因此相加合法。输出的常量 (twoThousandAndOne) 的推断类型为 UInt16,因为其为两个 UInt16 值之和。
某些类型(初始值) 是调用 Swift 类型构造函数并传递初始值的默认方法。幕后运作情况是,UInt16 有一个接受 UInt8 值的构造函数,因此该构造函数会被用于根据现有 UInt8 创建新的 UInt16。不过,在这里并不能传入任意类型——只能传入 UInt16 提供有构造函数的类型。扩展现有类型使其提供接受新类型(包括自己定义的类型)的构造函数的方法请见 扩展 (后面会译到)一章。
整数和浮点数间的转换
整数与浮点数类型间的转换必须显式指定:
let three = 3
let pointOneFourOneFiveNine = 0.14159
let pi = Double(three) + pointOneFourOneFiveNine
// pi 等于 3.14159, 故而推断类型为Double
在上例中,常量 three 的值被用来创建一个新的 Double 类型,以便加号两侧的类型保持一致,如果类型没有转换,是不允许相加的。
反过来,浮点数到整数的转换同样可行,整数类型可以用 Double 或 Float 值初始化:
let integerPi = Int(pi)
// integerPi 等于 3, 类型推断为Int
这样用浮点数初始化为新的整数时,浮点数值总会被截断。即, 4.75 变为 4, -3.9 变为 -3。
注意:
数字常量或变量的结合规则与数字字面量的结合规则不同。字面量 3 可以直接与字面量 0.14159 相加,因为数字字面量没有明确指定类型,它们自身也没有明确的类型。其类型仅当被编译器求值时才推断得出。
谢谢,Swifter-QQ群:362232993,同好者进~
Fork:https://github.com/Joejo/Swift-lesson-for-chinese
Swift语言指南(五)--数字字面量和数字类型转换的更多相关文章
- Swift语言指南(四)--类型安全和类型推断
原文:Swift语言指南(四)--类型安全和类型推断 Swift是一门类型安全语言,类型安全语言需要代码里值的类型非常明确.如果你的代码中有部分值需要String类型,你就不能错误地传递Int. 鉴于 ...
- Swift编程语言学习1.4——数值型字面量、数值类型转换
数值型字面量 整数字面量能够被写作: 一个十进制数,没有前缀 一个二进制数,前缀是0b 一个八进制数,前缀是0o 一个十六进制数,前缀是0x 以下的全部整数字面量的十进制值都是17: let deci ...
- Swift语言指南(七)--语言基础之布尔值和类型别名
原文:Swift语言指南(七)--语言基础之布尔值和类型别名 布尔值 Swift有一个基本布尔类型,叫做布尔(bool),布尔值又称逻辑值(logical),因为它只能为真(true)或假(false ...
- Swift语言指南(六)--可选值
原文:Swift语言指南(六)--可选值 在值可能不存在的情况下使用可选值(optional), 可选值是: · 存在一个值,这个值等于 x 或 · 不存在任何值 注: 在 C 和 Objective ...
- Swift语言指南(一)--语言基础之常量和变量
原文:Swift语言指南(一)--语言基础之常量和变量 Swift 是开发 iOS 及 OS X 应用的一门新编程语言,然而,它的开发体验与 C 或 Objective-C 有很多相似之处. Swif ...
- Swift语言指南(十)--字符串与字符
原文:Swift语言指南(十)--字符串与字符 字符串是一段字符的有序集合,如"hellow,world"或"信天翁".Swift 中的字符串由 String ...
- Swift语言指南(三)--语言基础之整数和浮点数
原文:Swift语言指南(三)--语言基础之整数和浮点数 整数 整数指没有小数的整数,如42,-23.整数可以是有符号的(正数,零,负数),也可以是无符号的(正数,零). Swift提供了8,16,3 ...
- Swift语言指南(八)--语言基础之元组
原文:Swift语言指南(八)--语言基础之元组 元组 元组(Tuples)将多个值组合为一个复合值.元组内的值可以是任何类型,各个元素不需要为相同类型(各个元素之间类型独立,互不干扰--Joe.Hu ...
- Swift语言指南(九)--基本运算符
原文:Swift语言指南(九)--基本运算符 运算符(operator)是用来检查,改变或合并值的一种特殊符号或短语.例如,加号运算符让两个数字相加(如:let i = 1 + 2),还有些更复杂的运 ...
随机推荐
- java设计模式演示示例
创建一个模式 1.工厂方法模式(Factory Method) 该程序创建的操作对象,独自一人走出流程,创建产品工厂接口.实际的工作转移到详细的子类.大大提高了系统扩展的柔性,接口的抽象化处理给相互 ...
- eclipse在maven项目交付svn忽略简介
文章来源:http://blog.csdn.net/chaijunkun/article/details/34805385,转载请注明. 不时因为它将有关鲍恩梳理,它会做出相应的内容不变.文. ecl ...
- Google API快速生成QR二维码
Google API快速生成QR二维码 现在来说生成二维码最简单的方法是使用Google Chart API来实现,再次膜拜Google大神- Google Chart API是一套可以让你在线生成报 ...
- UVA 439 Knight Moves(BFS)
Knight Moves option=com_onlinejudge&Itemid=8&category=11&page=show_problem&problem=3 ...
- 高仿淘宝送货地址暴走漫画系列(附demo)
演讲: 我是个程序员,一天我坐在路边一边喝水一边苦苦检查bug. 这时一个乞丐在我边上坐下了,開始要饭,我认为可怜.就给了他1块钱. 然后接着调试程序.他可能生意不好,就无聊的看看我在干什么.然后过了 ...
- 使用AppCompat_v7 21.0.0d的几个兼容问题
1.实现新的ActionBarDrawerToggle动画 ActionBarDrawerToggle使用最新的AppCompat_v7 21会出现一个非常帅的动画.使用方式在Androidstudi ...
- 【从零学习openCV】IOS7根据人脸检测
前言: 人脸检測与识别一直是计算机视觉领域一大热门研究方向,并且也从安全监控等工业级的应用扩展到了手机移动端的app.总之随着人脸识别技术获得突破,其应用前景和市场价值都是不可估量的,眼下在学习ope ...
- 读改善c#代码157个建议:建议13~15
目录: 建议13:为类型输出格式化字符串 建议14:正确实现浅拷贝和深拷贝 建议15:使用dynamic来简化反射实现 一.建议13:为类型输出格式化字符串 有些类型需要我们根据业务需求提供字符串的格 ...
- WPF学习(4)逻辑树和可视树
前面几节说了一些WPF的基础,包括XAML和布局等.在接下来的几节,我们来说说WPF的核心概念,包括逻辑树和可视树.依赖对象和依赖属性.路由事件.命令这几个部分.本节介绍下逻辑树(Logical Tr ...
- 使用php+swoole对client数据实时更新(二) (转)
上一篇提到了swoole的基本使用,现在通过几行基本的语句来实现比较复杂的逻辑操作: 先说一下业务场景.我们目前的大多数应用都是以服务端+接口+客户端的方式去协调工作的,这样的好处在于不论是处在何种终 ...