根据我的理解,斯威夫特本身并没有#34;支持Objective-C message passing - 从Obj-C类继承的类可以使用它,但Swift代码使用C ++样式的vtable。这是两种语言之间的主要区别,也是许多辩论的来源。
当前版本的Swift(3)是否还没有Objective-C的任何其他功能?
答案 0 :(得分:1)
Swift初始化程序是一种专用语言功能,它将Objective C的C:\Users\Semaphore\Desktop\test.txt.txt
和alloc
合并为一个。在Objective C中,初始化器只是遵循特定约定(关于它们的名称和功能)的实例方法(在已分配但未初始化的init
创建的实例上调用)。
初始化程序的Objective C方法使得创建类集群变得非常容易。也就是说,有一个抽象的超类决定自己最合适的子类来初始化。
考虑一般alloc
抽象类的情况,可以是Image
或PNGImage
。您可能希望从路径初始化新的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"]);
}
,Foundation
,AppKit
等类,NSArray
,NSDictionary
等框架广泛完成此操作。
Swift替代方案非常简单:只需创建一个类方法而不是初始化器:
NSImageRep
答案 1 :(得分:0)
Swift无法访问C联盟的成员。 Swift的强大枚举承担了C枚举和标记联合的角色,但它们并不是从C联合自动生成的。