从Objective-C调用Swift类方法

时间:2018-01-02 22:42:49

标签: ios objective-c swift objective-c-swift-bridge

我在Swift中有这个功能

class func someFunction(idValue: Int, completionHandler: @escaping (_ jsonData: JSON) -> ()) {
        (...)
        if (some validation) {
            completionHandler(jsonData)
        } else {
            completionHandler(JSON.null)
        }

    }

现在我想从Objective-C调用该函数。我在做的是:

[[ClassName  new] someFunction:self.sesionId completionHandler:^{
    }];

但投掷"没有可见的@interface为' ClassName'声明选择器&some; someFunction:completionHandler:'

如何调用此功能?

2 个答案:

答案 0 :(得分:2)

基本上NSObject是Apple开发中的基础对象类型。

  

大多数Objective-C类层次结构的根类,子类从该类继承运行时系统的基本接口,并具有表现为Objective-C对象的能力。

您的课程使用NSObject晚餐课程(与您的要求相关)来定义。

class ClassName: NSObject {

    class func someFunction(idValue: Int, completionHandler: @escaping (_ jsonData: String) -> ()) {


    }
}

调用此函数

[ClassName someFunctionWithIdValue:12 completionHandler:^(NSString * test) {

}];

答案 1 :(得分:0)

除了继承自NSObject并使用@objc声明类外,似乎还必须将@objc添加到func声明中,以便在Objective-c类/文件中可以看到它。

像这样:

@objc class SomeClass:NSObject {


 @objc func someFunction(_:Any) -> Bool {  
        return true
       }

}

然后正常调用时,它将显示在自动完成中:

#import "PROJECT_Name-Swift.h"
@implementation SomeObjCClass
...


-(void)someObjCMethod{

    SomeClass* instance = [[SomeClass alloc]init];

    [instance someFunction:(id _Nonnull)]
}
...
@end

公共关键字的存在似乎都没有影响