swift-4 数据的存储以及转换

整数

swift 提供了8, 16, 32, 64位的有符号和无符号整数类型.类似 C语言的命名方式,比如8位无符号整数类型就是UInt8,32位有符号整数类型就是Int32.就像 swift 的其他类型一样,整数类型采用大写命名法.

整数范围

如果想获取对应类型的最大值和最小值,也是很方便的.
let min = UInt8.min // min 为0,是 UInt8类型
let max = UInt8.max // max 为255

Int

一般来说,不需要专门指定整数的长度, swift提供了一个特殊的整数类型Int,长度与当前平台的原生字长相同:
在32位平台上IntInt32长度相同.
在64位平台上IntInt64长度相同.
除非你需要特定长度的整数,一般来说使用Int就够了.这可以提高代码的一致性和可复用性.即使是在32位平台上,Int可以存储的整数范围也可以达到-2,147,483,648~2,147,483,647,这个数已经够大了.

UInt

swift 也提供了一个特殊的无符号类型哦,长度与当前平台的原生字长相同.
大家尽量不要使用UInt,除非你真想要存储一个和当前平台原生字长相同的无符号整数.出了这种情况,最好使用Int,即使你要存储的值已知是非负的.统一使用Int 可以提高代码的复用性,避免不同类型数字之间的转换,并且匹配数字的类型推断.

浮点数

浮点数大家都知道,就是有小数部分的数字.比如3.1415926,-2.3442332.
浮点类型比整数类型表示的范围更大,可以存储比Int类型更大或者更小的数字.swift 提供了两种有符号浮点数类型:
Double表示64位浮点数,当你需要存储很大或者很高精度的浮点数时请使用此类型.
Float表示32位浮点数.精度要求不高的话可以使用此类型.
选择哪个类型取决于你的代码需要处理的值的范围.

类型安全和类型推断

swift 是一个类型安全的语言.类型安全的语言可以让你清楚地知道代码要处理值的类型.如果你的代码需要一个 string,你千万不要传一个 int.
由于 swift是类型安全的,所以它会在编译你的代码时进行类型检查,并把不匹配的类型标记为错误,这可以让你在开发过程中尽早发现并修复错误.
当你要处理不同类型的值时,类型检查可以帮你避开错误.然而,这并不是说你每次声明常量和变量的时候都需要显式指定类型,如果你没有指定类型, swift会使用类型推断来选择合适的类型.有了类型推断,编译器可以在编译代码的时候自动推断出表达式的类型.原理很简单,只要检查你赋的值即可.
因为有类型推断,和 C或者 Objective-C 比起来 swift很少需要声明类型.常量和变量虽然需要明确的类型,但是大部分工作并不需要程序员来完成.
当你声明常量或者变量并赋初值的时候类型推断非常有用.当你在声明常量或者变量的时候赋给它们一个字面量(literal value)即可触发类型推断.字面量就是会直接出现在你代码中的值,如449.8678
如果你给一个新常量赋值42并且没有标明类型, swift 可以推断出常量类型是Int,因为你给它赋的初始值是个整数.
let value = 44 //value 会被推断为 Int类型
同样的,其他类型也是可以推断出来的,这里不再赘述.

数值型字面常量

整数字面量可以被写作 :
- 一个十进制数没有前缀
- 一个二进制数,前缀是0b
- 一个八进制数,前缀是0o
- 一个十六进制数,前缀是0x
下面列举的所有整数字面量的十进制值都是16:
let d = 16
let b = 0b10000 // 二进制的16
let o = 0o20 // 八进制的16
let h = 0x10 // 十六进制的16

浮点字面量可以是十进制(没有前缀)或者是十六进制(前缀是0x).小数点两边必须有至少一个十进制数字(或者是十六进制的数字).浮点字面量还有一个可选的指数(exponent),在十进制浮点数中通过大写或者小写 e 来指定,在十六进制浮点数中通过大写或者小写的 p 来指定.
如果一个十进制数的指数为 exp,那这个数相当于基数和10^exp 的乘积
*1.25e2表示1.25x10^2,等于125.0.
*1.25e-2表示1.25x10^-2,等于0.0125.
如果一个十六进制数的指数为 exp,那这个数相当于基数和2^exp 的乘积
*0xFp2表示15x2^2,等于60.0
*0xFp-2表示15x2^-1等于3.75
数值类型字面变量可以包括额外的格式来增强可读性.整数和浮点数都可以添加额外的0并且包涵下划线,并不会影响字面量:
let p = 00001122.2334
let m = 1_000_000
let n = 1_000_000.000_000_002

数值类型转换

即使代码中的整数常量和变量已知非负数,也最好使用Int类型.总是使用默认的整数类型可以保证你的整数常量和变量可以直接被复用并且可以匹配整数类字面量的类型推断.
只有在必要的时候才使用其他整数类型,比如要处理外部的长度明确的数据或者为了优化性能.使用显式指定长度的类型可以及时发现值溢出并且可以暗示正在处理的特殊数据.

整数转换

不同整数类型的变量和常量可以存储不同范围的数字.Int8类型的常量或者变量可以存储的数字范围是-128~127,而UInt8类型的常量或者变量能存储的数字范围是0~255.如果数字超出了常量或者变量的可存储范围,编译时就会报错.

let a:UInt8 = -1 // UInt8类型不能存负数,此时会报错
let abigValue:Int8 = Int8.max + 1 // Int8类型不能存储超过其最大值的数,此时会报错

由于每种整数类型都可以存储不同范围的值,所以你必须根据不同的情况选择性使用数值型类型转换.这种选择性使用的方式,可以预防隐式转换的错误并让你的代码中的类型转换意图变得清晰.
要将一种数字类型转换成另一种,你要用当前值来初始化一个期望类型的新数字,这个数字的类型就是你的目标类型.在下面的例子中,常量aUInt16类型,然而常量b是一个UInt8类型.它们不能直接相加,因为它们类型不同.所以要调用UInt16(b)来创建一个新的UInt16数字并用b 的值来初始化,然后使用这个新数字来计算:
let a:UInt16 = 1_000
let b:UInt8 = 1
let ab = a + UInt16(b)

现在两个数字的类型都是UInt16,可以进行相加.目标常量ab 的类型被推断为UInt16,因为它是两个UInt16值的和.

整数和浮点数转换

整数和浮点数的转换必须是显式指定类型
let a = 3
let b = 0.23
let ab = Double(a) + b //ab 等于3.23 ,所以被推测为 Double 类型

浮点数到整数的反向转换同样可以,这里不再赘述.
结合数字类常量和变量不同于结合数字类字面量.字面量3可以直接和字面量0.13相加,因为数字字面量本身没有明确的类型,它们的类型只在编译器需要求值的时候被推测.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lucy-JY

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值