objective-c - 在 Swift 协议中使用 ObjC 块
问题描述
我正在尝试将代码从 Objective-C 转换为 Swift。不可能全部转换,因为该项目使用 C++,因此也使用 Objective-C++,但至少使用的协议应该用 Swift 编写。
因此,在尝试将块转换为属性时,我偶然发现了一些问题。
我的 Objective-C 协议:
@protocol ObjcProtocol<NSObject>
@property (nullable, nonatomic, copy, readwrite) dispatch_block_t callback;
@end
我的 Swift 协议:
@objc public protocol SwiftProtocol: NSObjectProtocol {
var callback: ()->() { get set }
}
尝试在 Objective-C 中设置此属性时出现此错误:
“在‘NSObject *’类型的对象上找不到属性‘回调’”
创建的 Swift 头文件包含以下内容:
@property (nonatomic, copy) void (^ _Nonnull callback)(void);
我也偶然发现@convention(block)
。直接在 var 中声明它不起作用,因为我收到一个错误,声称它只能用作函数类型。所以我尝试使用类型别名:
public typealias callBackType = (@convention(block) () -> ())
这再次导致找不到该属性。
我尝试过但没有成功的其他方法是用@objc
.
将回调函数类型设置为可选也没有改变任何东西。
此外,我尝试创建一个包含回调的 Objective-C 协议,并使 SwiftProtocol 依赖于新创建的协议。结果一样...
我错过了什么?
解决方案
好的..结果即使 Xcode 可以自动完成代码,这并不意味着所有内容都正确导入到文件中。要解决我添加的上述问题@import <ModuleName.Swift>;
,它可以工作
推荐阅读
- java - 错误:缺少包语句“src”,但仍然可以在 IntelliJ 中运行代码
- spring-cloud-dataflow - 组合任务自定义条件
- apache-spark - Kafka Avro 到 Elasticsearch 与 Spark
- java - 使用 executeUpdate() 函数更新 Java 中的数据库记录
- javascript - 如何循环遍历 jquery 对象的另一个索引
- sql - 按特定顺序的 SQL 顺序
- php - CodeIgniter 单击移动设备中的任何菜单而不是登录过期问题
- c# - Json.Net 和 Web API 中的枚举验证
- c# - 从 .net 核心中的 API 响应下载 PDF 文件
- javascript - 如何使用布尔值更新 json 数组中的重复对象