Swift基础教程1.7 类型_Swift基础教程1.7 类型试读-查字典图书网
查字典图书网
当前位置: 查字典 > 图书网 > 编程 > Swift基础教程 > 1.7 类型

Swift基础教程——1.7 类型

在本章前面,Swift自动推断出了变量的类型,你注意到了吗?你不用输入额外的代码去告知Swift变量的类型究竟为Int还是Double,Swift自会根据等号右边的值推断出变量或常量的类型。 计算机语言使用类型将值和存储它们的容器分类。类型明确地指出了值、变量或常量的特征,让代码的意图更清晰,消除了二义性。类型犹如不可更改的契约,将变量或常量与其值紧密关联在一起。Swift是一种类型意识极强的语言,这一点在本章前面的一些示例中已经体现出来了。 表1-1列出了Swift基本类型。还有其他一些类型没有列出。另外你将在本书后面看到,可创建自定义类型,但目前我们只使用这些类型。 表1-1 变量类型 1.7.1 检查上限和下限 表11-1列出的每种数值类型都有上限和下限,即每种类型可存储的数字都不能小于下限,也不能大于上限,这是因为用于表示数值类型的位数是有限的。Swift让你能够查看每种类型可存储的最大值和最小值: 11> println(Int.min) -9223372036854775808 12> println(Int.max) 9223372036854775807 13> println(UInt.min) 0 14> println(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 <REPL>:8:5: error: 'Double' is not convertible to 'Int' x = y ^ 8> x = Int(y) 9> println(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) <REPL>:17:9: error: cannot invoke 'init' with an argument of type → '@lvalue String' var u = Int(s) ^~~~~~ 17> var v = Double(s) <REPL>:17:9: error: cannot invoke 'init' with an argument of type → '@lvalue String' var v = Double(s) ^~~~~~~~~ 在这方面,Swift划出了明确的界线。虽然可以将数值类型转换为String类型,但反过来不行。不过不用着急,完全可以将String的内容转换为Int或Double,但不是使用类型转换。 17> var myConvertedInt = s.toInt() myConvertedInt: Int? = 123 18> String类型有一个特殊方法,可用于将其内容转换为Int类型——toInt()。这个方法对字符串的内容进行评估,如果它包含的字符可组成有效的整数,就返回其整数表示。第17行声明了变量myConvertedInt,并将一个Int值赋给它。 你可能感到迷惑,响应第17行时Swift显示了Int?,这其中的问号到底是什么意思呢?这表明myConvertedInt是特殊的Int类型:可选Int类型。可选类型将在后面更详细地介绍,你现在只需知道它们让变量可以为特殊值nil。 1.7.3 显式地声明类型 让Swift推断变量或常量的类型很方便:不用告诉Swift变量的类型是整型还是浮点型,它根据赋给变量的值就能推断出来。然后,有时需要显式地声明变量或常量的类型,Swift允许你在声明中指出这一点: 18> var myNewNumber : Double = 3 myNewNumber: Double = 3 19> 将变量或常量声明为特定类型很简单,只需在变量或常量的名称后面加上冒号和类型名。上面的代码将myNewNumber声明为Double变量,并将数字3赋给它,而Swift忠实地报告了声明结果。 如果在第18行省略: Double,结果将如何呢?Swift将根据赋给变量myNewNumber的值确定其类型为Int。在这个示例中,我们推翻了Swift的假设,强制将变量声明为所需的类型。 如果没有给变量或常量赋值,结果将如何呢? 19> var m : Int :19:5 error: variables currently must have an initial value when entered at the → top level of the REPL 20> let rr : Int <REPL>:20:5: error: 'let' declarations require an initializer expression let rr : Int ^ 第19行将变量m声明为Int类型,但没有在声明的同时给它赋值。Swift显示一条错误消息,指出在REPL中必须给变量赋初值。 接下来的一行使用let命令将rr声明为Int常量,但没有赋值。注意到Swift也显示了一条错误消息,指出必须有初始化表达式。由于常量是不变的,声明时必须给它们赋值。

展开全文

推荐文章

猜你喜欢

附近的人在看

推荐阅读

拓展阅读

《Swift基础教程》其他试读目录

• 1.1 革命性的改良
• 1.2 准备工作
• 1.3 准备出发
• 1.4 开始探索Swift
• 1.5 声明的威力
• 1.6 常量
• 1.7 类型 [当前]
• 1.8 字符串
• 1.9 数学运算符
• 1.10 布尔类型
• 1.11 轻松显示
• 1.12 使用类型别名
• 1.13 使用元组将数据编组
• 1.14 可选类型
• 1.15 小结