【主要内容】
1.整型
2.浮点型
3.类型安全和类型推断
4.数值型字面量
5.数值类型转换
6. 类型别名
一、整型
1.1 整数和整型
编程语言中的整型是用来表示我们自然界中的整数。先来补习一下小学的知识,整数的概念:正整数、零、负整数统称为整数。
按照有无符号可以分为两种:1.有符号整数(正整数、零、负整数)2.无符号整数(正整数和零)
Swift提供了8,16,32和64位的有符号和无符号的整数类型,比如:8位无符号整数类型是UInt8,32位有符号整数类型Int32。
1.2 整型表示的范围
Swift中提供了min和max属性来访问不同整数类型的最小值和最大值,比如8位无符号/有符号整型表示的最大值最小值,如图:
1.3 Int类型
一般写代码的时候不需要专门制定整数类型的长度,Swift还提供了一个特殊的整数类型:Int,Int类型的长度取决于当前平台的系统位数:
在32位平台上Int类型就是32位,和Int32长度相同。
在64位平台上Int类型就是64位,和Int64长度相同。
1.4 UInt类型
UInt类型和Int类型一样,它的长度取决于当前平台的系统位数。
注意:
开发中尽量不要使用UInt类型,最好使用Int,即使你要储存的值就是非负数。可以提高代码的复用性,避免不同类型数字之间的转换,并且匹配数字的类型推断。
二、浮点型
浮点数就是带有小数点的数字,比如常见的:3.14,0.618。Swift中提供了两种浮点数类型:
Float 表示32位浮点数。精度要求不高的话使用此类型。
Double表示64位浮点数。当需要储存很大或者很高精度的浮点数的时候才使用此类型。
注意:
Double的精度可以达到小数点后至少15位数字,而Float只有小数点后6位。一般来说Float类型足够用。
三、类型安全和类型推断
Swift是一种类型安全(type safe)的语言。类型安全的语言可以让你清除的知道代码要处理的值的类型。如果你的代码需要传递的参数是String类型,那么你绝对不可能不小心船进入一个非String类型。
由于Swift是类型安全的,所以它会在编译你的代码时进行类型检查(typy checks),并把不匹配的类型标记为错误,这样可以让你尽早的发现问题并修复。
当你要处理不同类型的值时,类型检查可以帮你避免错误。但是你不必每次声明常量、变量的时候都显示制定类型,如果没有制定类型,Swift会使用类型推断(type inference)帮你选择合适的类型。原理就是检查你的赋值即可。
虽然有类型推断,但是Swift很少需要自己显示声明类型,这些工作交给编译器去做就可以了。
例如:
声明一个没有标注类型的常量money,赋值998,Swift可以推断出常量的类型是Int,从下图控制台的信息可以得到论证:
如果你给变量、常量赋值了一个浮点类型的值,Swift会默认推断为Double类型,如图:
四、数值型字面量
一个整数的字面量可以被写成以下几种形式:
一个十进制数,没有前缀
一个二进制数,前缀是0b
一个八进制数,前缀是0o
一个十六进制数,前缀是0x
比如:
浮点型字面量可以是十进制(没有前缀)或者十六进制(前缀是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
数值类字面量可以包括额外的格式来增强可读性。整数和浮点数都可以添加额外的零并且包含下划线,并不会影响字面量:
let paddedDouble = 000123.456 let oneMillion = 1_000_000 let justOverOneMillion = 1_000_000.000_000_1
五、数值型类型转换
在开发的时候,如果没有明确说一定要声明无符号整型(要求优化性能、减少内存占用等),请使用系统默认的Int类型。因为系统默认整数类型的字面量默认的类型推断也是Int类型。
5.1 整数之间的转换
不同的整数类型存储的范围不同,可以通过max和min属性得到。Int类型可以存储的数值范围:-128~127,UInt类型存储的数值范围:0~255。如果超出了这个范围系统在编译的时候就会报错:
上边这两个错误就是说:你存储的值溢出了当前这个类型所表示的范围。
如果想要两个不同整数类型的值进行操作的时候,必须要转化成相同的类型:
let value1: UInt16 = 2_000 let value2: UInt8 = 1 let value3 = value1 + UInt16(value2)
value1是UInt16类型,value2是UInt8类型,需要先用SomeType(ofInitialValue)方法将value2转化为UInt16类型的数再进行运算。
5.2整数和浮点数转换
整数和浮点数的转换必须显式指定类型:
let integerValue = 7 let fValue = 3.14 let fNumber = Double(integerValue) + fValue print("fNumber = \(fNumber)")
常量integerValue被转换成了Double类型,这样加号两边的数类型相同就可以进行运算。
浮点类型同样可以转换成整数类型:
let integerNum = Int(fValue) print(integerNum)
当浮点类型转换为整数类型的时候,浮点类型会丢失精度,只保存浮点类型的整数位。上边integerNum输出的值为3。
注意:
数字类型的常量或变量进行运算,不同于数字字面量之间进行运算。数字字面量可以直接进行运算,比如3 + 0.1415,因为数字字面量本身没有确定的类型,但是数字类型常量、变量是会被编译器推断出具体类型的,只有类型相同才能进行运算。
六、类型别名
类型别名(type aliases)就是给现有的类型定义一个新的名字。跟OC里边的typedef是类似。在Swift中你可以使用typealias关键字来定义类型别名。平常在开发的时候偶尔也会用到但是不多。类型别名在苹果的Api里边大量的出现,特别是在一些地图类、音视频类等等的Api里边,经常会给现有类型起一个更有意义的别名。
比如:在GCD里边,如果想要某个线程延迟几秒执行,你得先定义一个延迟时间dispatch_time_t ,你点击进去查看Api就会发现其实它是UInt64类型:
下边自己定义一个类型别名:
typealias requestTimeOut = Int var time:requestTimeOut = 10 time = 7 print(time) print(requestTimeOut.max)
上边的定义了一个请求超时时间的类型别名,那么以前需要用到Int的地方就可以直接替换成requestTimeOut。
欢迎大家关注”芒果iOS“微信公众账号,芒果会经常为大家分享好的技术文章: