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),还有些更复杂的运 ...
随机推荐
- RH133读书 笔记(3) - Lab 3 Configuring the kernel
Lab 3 Configuring the kernel Goal: Develop skills tuning the /proc filesystem. Gain some experience ...
- 《学习opencv》笔记——矩阵和图像处理——cvMax,cvMaxS,cvMerge,cvMin and cvMinS
矩阵和图像操作 (1)cvMax函数 其结构 void cvMax(//比較两个图像取最大值 const CvArr* src1,//图像1 const CvArr* src2,//图像2 CvArr ...
- 单元测试React
React单元测试——十八般兵器齐上阵,环境构建篇 一个完整.优秀的项目往往离不开单元测试的环节,就 github 上的主流前端项目而言,基本都有相应的单元测试模块. 就 React 的项目来说,一套 ...
- LeetCode——Climbing Stairs
You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb ...
- 设计模式 Template Method模式 显示程序猿的一天
转载请注明出处:http://blog.csdn.net/lmj623565791/article/details/26276093 不断设计模式~ Template Method模式 老套路,看高清 ...
- Visual Studio Team Services使用教程--添加团队成员
- 使用php+swoole对client数据实时更新(二) (转)
上一篇提到了swoole的基本使用,现在通过几行基本的语句来实现比较复杂的逻辑操作: 先说一下业务场景.我们目前的大多数应用都是以服务端+接口+客户端的方式去协调工作的,这样的好处在于不论是处在何种终 ...
- 好大滴坑, Spring MVC覆盖了Trsaction
好大滴坑. Spring MVC覆盖了Trsaction 解决方式: <!-- package-scan 4 Spring MVC --> <context:component-sc ...
- navicat如何导入sql文件
工具--数据的传输--文件 版权声明:本文博客原创文章,博客,未经同意,不得转载.
- Extjs grid column里添加button等html标签,并增加点击事件
Extjs里有个actioncolumn,但actioncolumn只能添加一系列button,不能既有字又有button 如何能在column里增加html标签,并给button添加事件呢? 1. ...