如何在Swift类中调用Objective C中的单例类方法?

时间:2015-03-21 08:53:40

标签: objective-c swift singleton class-method

我有以下目标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

有人可以告诉我可能出现的问题吗?

4 个答案:

答案 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)

您的示例中还有一些其他错误:sharedLogsharedLogger。 这是一个应该有效的例子:

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("")