"No visible @interface for 'MySwiftFile' declares the selector '****'" 在 iOS 框架中

"No visible @interface for 'MySwiftFile' declares the selector '****'" in iOS framework

我在 iOS 的 ObjC 框架中使用 Swift 时遇到了问题。我的框架有 Objective-C 代码,我想从中调用 Swift 代码。

我想我已经正确地创建了桥接,我将在下面展示我所做的。

MySwiftFile.swift :

open class MySwiftFile: NSObject {
  var varDummy : RandomType? = nil
  open func setupDummy(param1 : RandomType1) {
    varDummy = RandomType(p: param1)
  }
}

MyObjCFile.m :

@class MySwiftFile;
#import "MyFramework/MyFramework-Swift.h"

@interface A : NSObject<...>
@property(atomic) MySwiftFile *mySwiftFile;

.....
@end
@implementation Aclass
......
@end

@interface B ()
....
@property(readonly, nonatomic) A *refA;
@end

@implementation B
....
- (void)methodCalledSomewhere:(RandomType1 *)type {
   ....
   refA.mySwiftFile = [[MySwiftFile alloc] init];
   [refA.mySwiftFile setupDummy: type];   <====THIS LINE PRODUCES THE ERROR
}
....

总而言之,我想初始化 属性 并从 ObjC 代码调用 Swift 对象的函数。 Xcode 似乎将 MySwiftFile 识别为有效类型,那么为什么它不允许我调用“setupDummy”方法?

错误为2:

第一个问题是您忘记将其暴露给 Objective-C。要么添加 @objcMembers 以公开所有内容 ...

@objcMembers
open class MySwiftFile: NSObject {
    ...
}

... 或者只需将 @objc 添加到您的 setupDummy 函数中 ...

@objc
open func setupDummy(param1: String) {
    ...
}

第二个问题是函数名如何翻译成Objective-C ...

  • @objc func setupDummy(param1 : RandomType1) -> setupDummyWithParam1:
  • @objc func setupDummy(_ param1: RandomType1) -> setupDummy:
  • @objc(setupDummy:) func setupDummy(param1: String) -> setupDummy:

... 这意味着只添加 @objc 是行不通的。您必须更改 Swift 函数签名或在 Objective-C 中使用 setupDummyWithParam1: 或保留 Swift 函数签名并使用 @objc(<name>) 更改 Objective-C选择器。