有办法吗?假设函数是“myFunc”,调用看起来像是什么:
@objc class ClassTwo {
func myFunc() -> () {
println("class ClassTwo instance function myFunc")
}
}
IOW从swift调用myFunc如下所示,那么如何在ObjC中编写相同的调用?
ClassTwo().myFunc()
答案 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)
ClassTwo
未声明为+alloc
。但是,作为Objective-C兼容性的一部分,实践中的所有Swift类都有一个NSObject方法的基本子集,包括+alloc
;它只是没有公开声明,因此编译器不知道。
如果你不想在你的类中添加另一个方法,另一个解决方案是在Objective-C中声明(但不实现)一个声明+alloc
的虚拟类别,这样编译器就会认为这个类有+alloc
,并允许[[ClassTwo alloc] init]
编译。
@interface ClassTwo (Alloc)
+ (instancetype)alloc;
@end