在Swift协议中使用ObjC块

时间:2018-05-24 07:51:57

标签: objective-c swift closures objective-c-blocks swift-protocols

我试图将代码从Objective-C转换为Swift。它不可能转换所有它,因为该项目使用C ++,因此也使用Objective-C ++,但至少使用的协议应该用Swift编写。

因此,在尝试使用块作为属性进行转换时,我偶然发现了问题。

我的Objective-C协议:

@protocol ObjcProtocol<NSObject>

@property (nullable, nonatomic, copy, readwrite) dispatch_block_t callback;

@end

My Swift协议:

@objc public protocol SwiftProtocol: NSObjectProtocol {
    var callback: ()->() { get set }
}

尝试在Objective-C中设置此属性我收到此错误:

&#34;财产&#39;回调&#39;在&#39; NSObject *&#39;&#34;

类型的对象上找不到

创建的Swift头文件包含:

@property (nonatomic, copy) void (^ _Nonnull callback)(void);

我也偶然发现@convention(block)。直接在var中声明它并不起作用,因为我得到一个错误声称它只能用作函数类型。所以我尝试过使用typealias:

public typealias callBackType = (@convention(block) () -> ())

再次导致财产无法找到。

我尝试了但没有成功的其他事情,是用@objc明确注释了该属性。

将回调函数类型设置为optional也不会改变任何内容。

此外,我尝试创建包含回调的Objective-C协议,并使SwiftProtocol依赖于新创建的协议。同样的结果......

我错过了什么?

1 个答案:

答案 0 :(得分:1)

好的..所以事实证明,即使Xcode可以自动完成代码,但并不意味着,一切都在文件中正确导入。为了解决上述问题,我添加了@import <ModuleName.Swift>;并且可以正常使用