Swift是一门动态类型的强类型语言
之前我一直以为,Swift是一门弱类型的语言。
判断依据:
Swift 变量不强制的指定类型,而是用
var
和let
表示可变与不可变。所以,Swift是一门弱类型的语言。
但是,看了一下强弱类型的时候,才恍然大悟。其实 var
和 let
的特性,只是说明Swift是一门动态类型的语言。并不能指出是否是强或弱类型。
一些定义:
- 静态类型语言:是一种编译器无法自动检测类型的语言。
- 动态类型语言:是一种编译器能够自动检测类型的语言。
- 强类型语言:强类型语言也称为强类型定义语言。是一种总是强制类型定义的语言,要求变量的使用要严格符合定义,所有变量都必须先定义后使用。
- 弱类型语言:弱类型语言也称为弱类型定义语言。与强类型定义相反。像vb,php,js等就属于弱类型语言。
光看定义不够生动,还是来举个例子:
Java是一种静态类型语言,也是一种强类型语言。因为编译器不能自动检测类型,所以它是静态的,而且类型受到严格限制,所以它也是一种强类型语言。
javascript是一种动态类型语言和非强类型语言。
因为编译器能够在运行时检测类型,并且类型也不受严格限制。
所以,基于上面的例子,你可以说swift允许我们不声明类型并且让编译器自己检测类型,所以swift被Apple官方公布为动态类型语言。
1 | let num = 1 |
这里没有强制声明类型,看似一个弱类型的语言,其实不然。Swift 编译器能够推断出 num
是 Int
类型。那么 num
就不能再被赋值为 String
类型。更不能写成如下的形式:
1 | let num = 1 |
编译器将会报如下的错误:
1 | error: binary operator '+' cannot be applied to operands of type 'Int' and 'String' |
这说明了,Swift 是一门强类型的语言。Swift 的类型声明,你可以看成是在定义变量的时候,隐式声明的(由编译器推断出),当然也可以显式的声明。如下:
1 | let num: Int = 1 |
参考:
- Swift is Dynamic and strong type language
- 关于 Swift 的 5 个误区