赵走x博客
网站访问量:151510
首页
书籍
软件
工具
古诗词
搜索
登录
7、数学运算符
6、字符串
5、类型
4、常量
3、声明的威力
2、开始探索 Swift
1、Swift简介
5、类型
资源编号:76618
Switch基础教程第二版
书籍
热度:94
在本章前面,Swift自动推断出了变量的类型,你注意到了吗?你不用输入额外的代码去告知 Swift变量的类型究竟为Int还是Double,Swift自会根据等号右边的值推断出变量或常量的类型。 计算机语言使用类型将值和存储它们的容器分类。类型明确地指出了值、变量或常量的特征, 让代码的意图更清晰,消除了二义性。类型犹如不可更改的契约,将变量或常量与其值紧密关联 在一起。Swift是一种类型意识极强的语言,这一点在本章前面的一些示例中已经体现出来了。 表1-1列出了Swift基本类型。还有其他一些类型没有列出。另外你将在本书后面看到,可创 建自定义类型,但目前我们只使用这些类型。 表1-1:变量类型 |类型|特征|示例| |---|---|---| |Bool|只有两个可能取值的类型,要么为true要么为false|true、false| |Int、Int32、Int64|32或64位的整数值,用于表示较大的数字,不包含小 数部分| 3、117、-502001、10045| |Int8、Int16|8或16位的整数,用于表示较小的数字,不包含小数 部分|-11、83、122| |UInt、UInt32、UInt64|32或64位的正整数,用于表示较大的数字,不包含小 数部分|3、117、50、10045| |UInt8、UInt16| 8或16位的正整数,用于表示较小的数字,不包含小 数部分|44、86、255| |Float、Double|可正可负的浮点数,可能包含小数部分|324.147、-2098.8388、16.0| |Character|用双引号括起的单个字符、数字或其他符号|"A" "!" "*" "5"| |String|用双引号括起的一系列字符|"Jambalaya" "Crawfish Pie" " Filet Gumbo"| 前面介绍过Int,但未介绍Int8、Int32和Int64,UInt、UInt8、UInt32和UInt64也未介绍。可 正可负的整数被称为有符号整数,其表示类型包括8、16、32和64位;只能为正的整数被称为无 符号整数,也有8、16、32和64位版本。如果没有指定32或64位,Int和UInt默认为64位。事实上, 在开发工作中很少需要考虑类型的长度。就现在而言,请不要考虑这些细节。 # 1.7.1 检查上限和下限 表1-1列出的每种数值类型都有上限和下限,即每种类型可存储的数字都不能小于下限,也 不能大于上限,这是因为用于表示数值类型的位数是有限的。Swift让你能够查看每种类型可存储 的最大值和最小值: ``` 11> print(Int.min) -9223372036854775808 12> print(Int.max) 9223372036854775807 13> print(UInt.min) 0 14> print(UInt.max) 18446744073709551615 15> ``` 在类型名后面加上.min或.max,即可获悉相应类型可存储的上下限值。第11~14行显示了类 型Int和UInt的取值范围。你也可以自己检查表1-1列出的其他类型的可能取值范围。 # 1.7.2 类型转换 鉴于类型是值、常量和变量的固有特征,你可能想知道不同类型交互式需要遵循的规则。还 记得吗,在本书前面的一个示例中,你尝试将一种类型的变量赋给另一种类型的变量。第一次尝 试这样做时引发了错误;经过“说服”后,才让Swift同意将一个Double型变量赋给一个Int型变 量。下面来重温这个示例(不用重新输入代码,只需在Terminal中向上滚动到能够看到前面输入 的代码即可): ``` 4> var x = 12 x: Int = 12 5> var y = 42.0 y: Double = 42 ``` 这些代码分别将Int和Double值赋给变量x和y,然后试图将y的值赋给x: ``` 8> x = y error: repl.swift:8:3: error: cannot assign value of type 'Double' to type 'Int' x=y ^ Int( ) 8> x = Int(y) 9> print(x) 42 ``` 第4行声明了变量x并将数字12赋给它,这使其类型为Int。接下来,将y声明为Double变量。 然后,将y赋给x时引发了错误,这迫使我们将y的值转换为Int,如第8行所示。这个过程称为强 制转换(casting),即强制将值从一种类型转换为另一种类型。在计算机语言中,这种功能被称 为类型转换。每种语言都有其类型转换规则,Swift当然也不例外。 一种常见规则是,类型转换只能在相似的类型之间进行。在C等流行的计算机语言中,可在 整数和双精度浮点数之间转换,因为它们都是数值类型。但强行将整数转换为字符串属于非法类 型转换,因为它们是截然不同的类型。在这方面,Swift更灵活些。请尝试下面的操作: ``` 15> var t = 123 t: Int = 123 16> var s = String(t) s: String = "123" 17> ``` 这里声明了变量t,并将一个Int值赋给它。接下来,声明了另一个变量s,将Int变量t的值 强制转换为String类型,并将结果赋给变量s。 能将String类型强行转换为Int乃至Double吗? ``` 17> var u = Int(s) u: Int? = 123 18> var v = Double(s) v: Double? = 123 ``` 可以。Swift让你能够将数据从一种类型转换为另一种类型。咱们来搅搅局,使用不是数字的 字符串给Swift设置点障碍: ``` 19> var w = Int("this is not a number") w: Int? = nil 20> ``` 显然,将这个字符串转换为整数是不明智的,因此Swift不允许这样做。但Swift没有返回错 误,而返回表示什么都没有的nil。你可能感到迷惑,响应第17~19行时Swift显示了Int?,这其中 的问号到底是什么意思呢?这表明myConvertedInt是特殊的Int类型:可选Int类型。可选类型将 在后面更详细地介绍,你现在只需知道它们让变量可以为特殊值nil。 # 1.7.3 显式地声明类型 让Swift推断变量或常量的类型很方便:不用告诉Swift变量的类型是整型还是浮点型,它根 据赋给变量的值就能推断出来。然后,有时需要显式地声明变量或常量的类型,Swift允许你在声 明中指出这一点: ``` 20> var myNewNumber : Double = 3 myNewNumber: Double = 3 21> ``` 将变量或常量声明为特定类型很简单,只需在变量或常量的名称后面加上冒号和类型名。上 面的代码将myNewNumber声明为Double变量,并将数字3赋给它,而Swift忠实地报告了声明结果。 如果在第20行省略Double,结果将如何呢?Swift将根据赋给变量myNewNumber的值确定其类 型为Int。在这个示例中,我们推翻了Swift的假设,强制将变量声明为所需的类型。 如果没有给变量或常量赋值,结果将如何呢? ``` 26> var m:Int m: Int = 0 27> let ee:Int ee: Int = 0 ```