当函数的类不从NSObject继承时,从ObjC调用swift实例函数

时间:2015-02-28 04:31:30

标签: objective-c swift

有办法吗?假设函数是“myFunc”,调用看起来像是什么:

@objc class ClassTwo {
    func myFunc() -> () {
        println("class ClassTwo instance function myFunc")
    }
}

IOW从swift调用myFunc如下所示,那么如何在ObjC中编写相同的调用?

ClassTwo().myFunc()

2 个答案:

答案 0 :(得分:1)

由于ClassTwo不是NSObject的子类,因此它不提供用于分配实例的标准alloc方法。如果你要在Swift中创建ClassTwo的实例,只是让Objective-C可以使用现有的实例(通过将它们传递给Objective-C方法或将它们存储在属性中),那就是不是问题。但是如果要在Objective-C中创建ClassTwo的实例,则需要提供一种方法来实现。例如:

@objc class ClassTwo {
    class func make() -> ClassTwo {
        return ClassTwo()
    }

    func myFunc() -> () {
        println("class ClassTwo instance function myFunc")
    }
}

要使用Objective-C ClassTwo文件中的.m,您需要导入项目 -Swift.h(其中项目是你的项目的名称)。然后你可以调用ClassTwo的类方法和ClassTwo实例的实例方法,如下所示:

#import "AppDelegate.h"
#import "project-Swift.h"

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    ClassTwo *two = [ClassTwo make];
    [two myFunc];

    return YES;
}

答案 1 :(得分:1)

rob mayoff的回答是正确的。当桥接到Objective-C时,ClassTwo未声明为+alloc。但是,作为Objective-C兼容性的一部分,实践中的所有Swift类都有一个NSObject方法的基本子集,包括+alloc;它只是没有公开声明,因此编译器不知道。

如果你不想在你的类中添加另一个方法,另一个解决方案是在Objective-C中声明(但不实现)一个声明+alloc的虚拟类别,这样编译器就会认为这个类有+alloc,并允许[[ClassTwo alloc] init]编译。

@interface ClassTwo (Alloc)
+ (instancetype)alloc;
@end