Swift是动态语言还是静态语言?

37

我很好奇 Swift 是否像 PHP 一样是动态的还是静态的,我的意思是在应用程序运行时是否可以生成类?


关于https://dev59.com/kYDba4cB1Zd3GeqPCEVF的评论,看起来Swift既可以静态调度也可以动态调度。 - Igor Barinov
4个回答

69

它是静态的-非常静态。编译器必须在编译时拥有关于所有类和函数的所有信息。您可以使用“扩展”现有类(使用extension),但即使如此,您仍必须在编译时完全定义该扩展内容。

Objective-C是动态的,并且由于在现实生活中,您可能会在Cocoa存在的情况下使用Swift,因此可以使用Objective-C运行时在向Objective-C公开的Swift类中注入/交换方法。即使您使用Swift语言,也可以这样做。但是Swift本身是静态的,事实上,它是明确设计的,以最小化或消除使用类似Objective-C的动态性。


3
我不懂 PHP,但我懂 Ruby。一般而言,我会说 Swift 和 Ruby 完全相反。Ruby 采用“鸭子类型”,Swift 使用严格的编译时类型。Ruby 在运行时定义其类(类定义本身是可执行语句); Swift 在编译时定义其类。Ruby 可以打开一个类并注入动态形成的方法;Swift 不能。 - matt

6

Swift本身是静态类型的。当与Cocoa一起使用时,您可以访问objective-c运行时库,从而使您能够使用动态类、消息等。这并不意味着语言本身是动态类型的。您可以使用C或任何支持与C桥接的语言来做同样的事情,使用libobjc.A.dylib


3
通常不会说“静态语言”,可以说静态类型语言或动态类型语言,也可以说强类型语言或非强类型语言。
Java是一种静态类型和强类型语言,因为编译器没有自动检测类型的能力,所以它是静态的,并且类型限制非常严格,因此它也是一种强类型语言。
而JavaScript既是动态类型语言又是非强类型语言。因为编译器有运行时检查类型的能力,而且类型没有严格限制。
基于上面的例子,你可以说Swift允许我们不声明类型,而是交给编译器自行检测类型,所以Swift被苹果官方宣布为一种动态类型语言。并且它也是一种强类型语言,因为即使你没有声明类型,如果编译器将其检测为字符串,则它也不会是任何其他类型。
希望这有帮助。

3
这是否直接与上面@matt的答案相矛盾? - rak appdev

1
只有在您想要使用Objective-C库时才需要使用它。Swift本质上是静态类型的。他们只是给你提供了接口,以便你可以逐渐转向Swift。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接