首页 > 解决方案 > 在 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 依赖于新创建的协议。结果一样...

我错过了什么?

标签: objective-cswiftclosuresobjective-c-blocksswift-protocols

解决方案


好的..结果即使 Xcode 可以自动完成代码,这并不意味着所有内容都正确导入到文件中。要解决我添加的上述问题@import <ModuleName.Swift>;,它可以工作


推荐阅读