之前我一直以為,Swift是一門弱類型的語言。
判斷依據:
Swift 變量不強制的指定類型,而是用
var
和let
表示可變與不可變。所以,Swift是一門弱類型的語言。
但是,看了一下強弱類型的時候,才恍然大悟。其實 var
和 let
的特性,只是說明Swift是一門動態類型的語言。并不能指出是否是強或弱類型。
一些定義:
- 靜態類型語言:是一種編譯器無法自動檢測類型的語言。
- 動態類型語言:是一種編譯器能夠自動檢測類型的語言。
- 強類型語言:強類型語言也稱為強類型定義語言。是一種總是強制類型定義的語言,要求變量的使用要嚴格符合定義,所有變量都必須先定義后使用。
- 弱類型語言:弱類型語言也稱為弱類型定義語言。與強類型定義相反。像vb,php,js等就屬于弱類型語言。
光看定義不夠生動,還是來舉個例子:
Java是一種靜態類型語言,也是一種強類型語言。因為編譯器不能自動檢測類型,所以它是靜態的,而且類型受到嚴格限制,所以它也是一種強類型語言。
javascript是一種動態類型語言和非強類型語言。
因為編譯器能夠在運行時檢測類型,并且類型也不受嚴格限制。
所以,基于上面的例子,你可以說swift允許我們不聲明類型并且讓編譯器自己檢測類型,所以swift被Apple官方公布為動態類型語言。
let num = 1
這里沒有強制聲明類型,看似一個弱類型的語言,其實不然。Swift 編譯器能夠推斷出 num
是 Int
類型。那么 num
就不能再被賦值為 String
類型。更不能寫成如下的形式:
let num = 1
let str = "2"
let result = num + str
編譯器將會報如下的錯誤:
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 的類型聲明,你可以看成是在定義變量的時候,隱式聲明的(由編譯器推斷出),當然也可以顯式的聲明。如下:
let num: Int = 1
參考: