我只是好奇,如果Swift像php或static一样动态,我的意思是我可以在应用程序运行时生成类吗?
答案 0 :(得分:45)
它是静态的 - 非常静态。编译器必须在编译时获得有关所有类和函数的所有信息。您可以“扩展”现有的类(使用extension
),但即使这样,您也必须在编译时完全定义该扩展包含的内容。
Objective-C是动态的,因为在现实生活中,你可能会在Cocoa存在的情况下使用Swift,你可以使用Objective-C运行时在暴露于Objective的Swift类中注入/ swizzle方法-C。即使您使用Swift语言说话,也可以这样做。但是Swift 本身是静态的,实际上是为了最小化或消除Objective-C型动态的使用而明确设计的。
答案 1 :(得分:3)
Swift本身,是静态类型的。与Cocoa一起使用时,您可以访问objective-c运行时库,该库使您能够使用动态类,消息和所有内容。这并不意味着语言本身是动态类型的。您可以使用libobjc.A.dylib
来使用C或支持与C桥接的任何其他语言执行相同的操作。
答案 2 :(得分:1)
一般来说,你永远不会说静态语言。你可以说静态类型语言或动态类型语言,你也可以说强类型语言。
因此java是一种静态类型语言以及强类型语言,因为编译器无法自动检测类型,因此它是静态的,并且类型受到严格限制,因此它也是一种强类型语言。
javascript既是动态类型语言,也是非强类型语言。因为编译器能够在运行时检测类型,并且类型也不受严格限制。
基于上面的例子,你可以说swift允许我们不要声明类型并留给编译器自己检测类型,因此swift被苹果官方宣布为动态类型语言。它也是一种强类型语言,你应该严格使用类型,即使你没有声明类型,如果编译器检测到它是一个字符串,那么它不是任何其他类型。
希望它有用。
答案 3 :(得分:0)
仅当您想使用目标c库时。 Swift本质上是静态类型的。它们只是为您提供界面,因此您可以逐渐转向swift。