首页 > 解决方案 > “'MySwiftFile' 没有可见的@interface 声明选择器'****'”在 iOS 框架中

问题描述

我在 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:

标签: iosobjective-cswiftios-frameworksobjective-c-swift-bridge

解决方案


第一个问题是你忘记将它暴露给 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 函数签名或setupDummyWithParam1:在 Objective-C 中使用或保留 Swift 函数签名并使用@objc(<name>)来更改 Objective-C 选择器。


推荐阅读