如何防止扩展导出到Objective-C的Swift头?

Mat*_*mar 5 objective-c ios swift swift3

我在Swift中做了这个简单的扩展:

extension DispatchQueue {
    func asyncAfter(delay: TimeInterval, block: @escaping ()->()) {
        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + Double(Int64(delay * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC), execute: block)
    }
}
Run Code Online (Sandbox Code Playgroud)

在Project-Swift.h头文件中,它报告此行的错误:

@interface OS_dispatch_queue (SWIFT_EXTENSION(...))
- (void)asyncAfterDelay:(NSTimeInterval)delay block:(void (^ _Nonnull)(void))block;
@end
Run Code Online (Sandbox Code Playgroud)

错误是:找不到'OS_dispatch_queue'的接口声明

有没有办法阻止为Objective-C导出扩展?或者有办法解决错误吗?

Bha*_*iya -3

您可以在或@objc之前使用来防止导出为 Objective-C,如下所示。funcmethod

extension DispatchQueue {
    @objc func asyncAfter(delay: TimeInterval, block: @escaping ()->()) {
        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + Double(Int64(delay * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC), execute: block)
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 它的“@noobjc”用于防止...但它并不能解决问题,因为类“DispatchQueue”仍然导出到“OS_dispatch_queue”,而“OS_dispatch_queue”对于 Objective-C 来说是未知的,并且仍然失败。 (2认同)