我有以下目标C代码,我需要进入Swift类:
在Logger.m中 -
+ (Logger *) log
{
static Logger *sharedLog = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedLogger = [[self alloc] init];
});
return sharedLogger;
}
- (void) printString:(NSString *) s
{
NSLog(s)
}
在Logger.h中作为 -
+ (Logger *) log;
- (void) printString:(NSString *) s;
现在,我已将此代码桥接到Swift Project - LoggerUserApp,我尝试使用单例log
共享类方法中的上述print方法。
我已经尝试过了 -
Logger.log().printString("String") // Compiler Error. Use Object Construction Logger()
Logger().log().printString("String") // Compiler Error.
Logger().log.printString("String") // Compiler Error.
Logger.printString("String") // This does not call log
有人可以告诉我可能出现的问题吗?
答案 0 :(得分:2)
如果Swift编译器错误地将方法识别为类工厂方法,则可以使用NS_SWIFT_NAME宏,传递方法的Swift签名以正确导入它。例如:
+ (id)recordWithQuality:(double)quality NS_SWIFT_NAME(record(quality:));
所以,你的方法应该是这样的:
+ (Logger *) log NS_SWIFT_NAME(log());
答案 1 :(得分:1)
我无法完全复制你的例子,但乍一看,这应该有效:
Logger.log().printString("String")
由于您的Obj-C单身是函数返回单身(因此Logger.log()
将返回您的单身。
但是,在您的示例代码中,我看到Logger
然后PALog
我无法说出这是否是您所需要的。
答案 2 :(得分:1)
您的示例中还有一些其他错误:sharedLog
和sharedLogger
。
这是一个应该有效的例子:
Logger.h
@interface Logger : NSObject
+ (Logger *) log;
- (void) printString:(NSString *) s;
@end
Logger.m
#import "Logger.h"
@implementation Logger
+ (Logger *) log
{
static Logger *sharedLog = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedLog = [[self alloc] init];
});
return sharedLog;
}
- (void) printString:(NSString *) s
{
NSLog(@"%@", s);
}
@end
...-桥接-Header.h
#import "Logger.h"
ViewController.swift
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
Logger.log().printString("Hello")
}
}
答案 3 :(得分:0)
在Swift更新中,如果类方法的名称与类名相似,那么它只需将其作为自定义初始化程序。现在由于方法中没有参数,因此不会出现默认初始值设定项。
因此,为了解决这个问题,我不得不将类方法log
的名称更改为不同的newLog
......并且它运行正常。
Logger.newLog().printString("")