Swift是一门动态类型的强类型语言

之前我一直以为,Swift是一门弱类型的语言。

判断依据:

Swift 变量不强制的指定类型,而是用 varlet 表示可变与不可变。所以,Swift是一门弱类型的语言。

但是,看了一下强弱类型的时候,才恍然大悟。其实 varlet 的特性,只是说明Swift是一门动态类型的语言。并不能指出是否是强或弱类型。

一些定义:

  • 静态类型语言:是一种编译器无法自动检测类型的语言。
  • 动态类型语言:是一种编译器能够自动检测类型的语言。
  • 强类型语言:强类型语言也称为强类型定义语言。是一种总是强制类型定义的语言,要求变量的使用要严格符合定义,所有变量都必须先定义后使用。
  • 弱类型语言:弱类型语言也称为弱类型定义语言。与强类型定义相反。像vb,php,js等就属于弱类型语言。

光看定义不够生动,还是来举个例子:

Java是一种静态类型语言,也是一种强类型语言。因为编译器不能自动检测类型,所以它是静态的,而且类型受到严格限制,所以它也是一种强类型语言。

javascript是一种动态类型语言和非强类型语言。
因为编译器能够在运行时检测类型,并且类型也不受严格限制。

所以,基于上面的例子,你可以说swift允许我们不声明类型并且让编译器自己检测类型,所以swift被Apple官方公布为动态类型语言。

1
let num = 1

这里没有强制声明类型,看似一个弱类型的语言,其实不然。Swift 编译器能够推断出 numInt 类型。那么 num 就不能再被赋值为 String 类型。更不能写成如下的形式:

1
2
3
let num = 1
let str = "2"
let result = num + str

编译器将会报如下的错误:

1
2
3
4
5
6
error: binary operator '+' cannot be applied to operands of type 'Int' and 'String'
let result = num + str
~~~ ^ ~~~
note: overloads for '+' exist with these partially matching parameter lists: (Int, Int), (String, String), (Int, UnsafeMutablePointer<Pointee>), (Int, UnsafePointer<Pointee>)
let result = num + str
^

这说明了,Swift 是一门强类型的语言。Swift 的类型声明,你可以看成是在定义变量的时候,隐式声明的(由编译器推断出),当然也可以显式的声明。如下:

1
let num: Int = 1

参考:

  • Swift is Dynamic and strong type language
  • 关于 Swift 的 5 个误区