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),还有些更复杂的运 ...
随机推荐
- grep在一个特定的文件搜索文件夹keyword
grep -R --include="*.*"(文件名匹配) key(keyword) dir(夹) eg.在当前文件夹搜索xml关键文件172.19.32.22 grep -R ...
- net搭建热插拔式web框架(沙箱的构建)
net搭建热插拔式web框架(沙箱的构建) 上周五写了一个实现原理篇,在评论中看到有朋友也遇到了我的问题,真的是有种他乡遇知己的感觉,整个系列我一定会坚持写完,并在最后把代码开源到git中.上一篇文章 ...
- 可以改变文本行距(行间距)的Label
////////////////////////////////////////////////////// /// ///功能:可以改变文本行距(行间距)的Label ///作者:emanlee / ...
- 对SA权限的再突破 (对付xplog70.dll被删)转载
原文:对SA权限的再突破 (对付xplog70.dll被删)转载 对SA权限的再突破 (对付xplog70.dll被删)转载 转载自:http://www.bitscn.com/plus/view.p ...
- Eamcs ditaa基于字符图形产生的图像上
ditta和artist mode这是一个好兄弟.artist mode帮我创建一个字符模式速度,ditta是java计划,字符图形可被读取,并生成图像. ditta网站:http://ditaa.s ...
- SharePoint 2010 Form Authentication (SQL) based on existing database
SharePoint 2010 表单认证,基于现有数据库的用户信息表 本文主要描写叙述本人配置过程中涉及到的步骤,仅作为參考,不要仅限于此步骤. 另外本文通俗易懂,适合大众口味儿. I. 开启并配置基 ...
- 进口fbx角色动画read-only解
原文链接:http://answers.unity3d.com/questions/8172/how-to-add-new-curves-or-animation-events-to-an-im.ht ...
- 【2014】【】辛星【php】【秋】【1】php构建开发环境
**************************什么是开发环境*********************** 1.我们学习PHP,是使用它来做web用的,通俗理解,就是做站点. 2.站点的执行须要 ...
- UVA10375 Choose and divide 质因数分解
质因数分解: Choose and divide Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & %l ...
- Different ways of associating known types in wcf
解释一下这个博客Known Types此属性标签,假设翻译的单词,所谓已知类型它.在服务契约中实现多态的行为.有四种方式实现,以下来分别演示一下. 1.User KnownType attribute ...