ios - “'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:
- '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 函数签名或setupDummyWithParam1:
在 Objective-C 中使用或保留 Swift 函数签名并使用@objc(<name>)
来更改 Objective-C 选择器。
推荐阅读
- php - 如何在字符串中使用编译时间常数 __LINE__ [PHP]
- jenkins - Jenkins 多分支管道 postbuild 仅在特定分支上(声明性)
- symfony - 如何为基本类型创建 JMSSerialization 处理程序,例如数组 <-> csv 字符串
- python - 为什么获取(user.models.DoesNotExist:CustomUser 匹配查询不存在。)?
- javascript - 如何将此嵌入到页面中?
- javascript - Javascript 对象结果具有附加字符
- java - For循环将数据写入文件Java
- angular - 辅助函数中的 ControlValueAccessor 提供程序在单元测试中不起作用
- mqtt - 当我使用带有红色节点的 MQTT 5.0 时,是否需要任何特殊配置?
- macos - 通过 macOS SwiftUI 应用程序中的应用程序菜单访问前窗口内容?