这事本来如果王垠在专家角度来说会比较好看一点。不过e神既然提到了swift的这个特性和PHP等动态语言进行类比,那就随便说一下。毕竟@我两次了,但是我觉得篇幅太长一直没回。
首先,我对swift的信息来源,并非来自于实践,官方文档好像要注册apple帐号啥的才能下,随便找到了这篇文档,就以此为准进行说明。
然后,要把论点具体化,我不想争论静态类型语言好还是动态类型语言好,这样话题范围太广。只是想说明下swfit的【不用在定义变量的时候声明类型】,和php等动态语言,具体有什么不同。
swfit(以及c#)和java比,有一个地方让人眼前一亮,就是可以在定义变量的时候不需要声明类型
var a = "asdf" // 因为"asdf"是String类型,所以a是String类型,没错,就这么智能
var b : String // 也支持像Java一样定义变量的时候,先不关联值,只是指定类型
b = a
print(b)
除此之外呢,swift和java在变量类型上的表现是差不多的,比如变量不能在它的作用域内变更类型
var a = "asdf"
a = 1 // 编译时就报错
归根结底,swift和java等静态类型语言有相同的一个特性:大部分变量数据类型都能在编译时确定。
对比一:
func a (b: String) -> String {
var c = "Hello World " + b
return c
}
在这里,我们可以第一眼看过去的时候,就知道参数b的类型是String。 那么PHP呢?
function a($b) {
$c = "hello World $b";
return c;
}
这里光看函数定义,$b是什么我们是不知道的。
对比二:
func a (b: String) -> String {
var c = "Hello World "
if b == "a" {
c = c + b
} else {
c = b + c
}
return c
}
在swift里,c的类型固定是String,那在php里呢?
function a($b) {
$c = "hello World";
if ($b == "a") {
$c = "hello World $b";
} else {
$c = strlen($b);
}
return c;
}
在PHP里,不仅变量不需要指定类型,变量本身的类型大部分情况下不到真正拿具体数据跑起来是不清楚的。
对比三:
这里就懒得直接写代码了,就拿class(或者你喜欢array也行)来说,里面的大量的变量数据类型,在swift里是基本稳定的,但是在PHP的语法层面是不确定的。(语法层面不确定,就代表编译器一开始是不确定数据类型的,编译器如果要进行JIT性能优化,第一步先要猜测类型)
结论:
swift(以及c#)相比于java等,同样都是静态类型的语言,它所谓的不用声明类型只是在定义变量的时候,语法规定可以直接从它的初始值推倒出它的类型,避免编码上的啰嗦。
只是语法上的一个特性而已,它是静态类型的本质是不变的。和PHP等动态类型语言,完全不是一回事。