什么语言功能来自Objective-C Swift缺乏?

时间:2017-01-15 21:43:05

标签: objective-c swift

根据我的理解,斯威夫特本身并没有#34;支持Objective-C message passing - 从Obj-C类继承的类可以使用它,但Swift代码使用C ++样式的vtable。这是两种语言之间的主要区别,也是许多辩论的来源。

当前版本的Swift(3)是否还没有Objective-C的任何其他功能?

2 个答案:

答案 0 :(得分:1)

Class Clusters

Swift初始化程序是一种专用语言功能,它将Objective C的C:\Users\Semaphore\Desktop\test.txt.txtalloc合并为一个。在Objective C中,初始化器只是遵循特定约定(关于它们的名称和功能)的实例方法(在已分配但未初始化的init创建的实例上调用)。

初始化程序的Objective C方法使得创建类集群变得非常容易。也就是说,有一个抽象的超类决定自己最合适的子类来初始化。

考虑一般alloc抽象类的情况,可以是ImagePNGImage。您可能希望从路径初始化新的JPGImage,但您通常必须手动检查类型,启用它,并选择要使用的最合适的子类。 Objective C允许您将此逻辑封装在Image的初始化程序中,如下所示:

Image

对于#import <Foundation/Foundation.h> @interface Image: NSObject @end @interface PNGImage: Image @end @implementation PNGImage @end @interface JPGImage: Image @end @implementation JPGImage @end @implementation Image - (id) initFromPath: (NSString *) path { NSString *ext = [path pathExtension]; if ([ext isEqual: @"png"]) return self = [PNGImage init]; else if ([ext isEqual: @"jpg"]) return self = [JPGImage init]; else return nil; } @end int main (int argc, const char * argv[]) { NSLog(@"%@", [[Image alloc] initFromPath: @"foo.png"]); } FoundationAppKit等类,NSArrayNSDictionary等框架广泛完成此操作。

Swift替代方案非常简单:只需创建一个类方法而不是初始化器:

NSImageRep

答案 1 :(得分:0)

缺少C互操作性功能

不完整的联盟支持

Swift无法访问C联盟的成员。 Swift的强大枚举承担了C枚举和标记联合的角色,但它们并不是从C联合自动生成的。