"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:
- 'MySwiftFile' 没有可见的@interface 声明了选择器 'setupDummy:'
- 'MySwiftFile' 没有可见的@interface 声明了选择器 'setupDummy'
第一个问题是您忘记将其暴露给 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选择器。
我在 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:
- 'MySwiftFile' 没有可见的@interface 声明了选择器 'setupDummy:'
- 'MySwiftFile' 没有可见的@interface 声明了选择器 'setupDummy'
第一个问题是您忘记将其暴露给 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选择器。