【问题标题】:Calling Swift class method from Objective-C从 Objective-C 调用 Swift 类方法
【发布时间】:2018-01-02 22:42:49
【问题描述】:

我在 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:^{
    }];

但是抛出“‘ClassName’没有可见的@interface声明选择器‘someFunction:completionHandler:’

如何调用这个函数?

【问题讨论】:

  • 这是一个类函数,你在一个对象上调用它。

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


【解决方案1】:

本质上,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) {

}];

【讨论】:

  • 使用 Swift 4 我必须在函数声明中添加 @objc 以使编译器在我的 Objective-C 代码中识别 Swift 类函数:@objc class func someFunction(idValue: Int, completionHandler: @escaping (_ jsonData: String) -> ())跨度>
【解决方案2】:

除了继承自 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

public 关键字的存在似乎对它没有任何影响

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    • 2015-03-28
    • 1970-01-01
    • 2012-02-09
    相关资源
    最近更新 更多