【问题标题】:How to prevent extension to be exported to Swift header for Objective-C?如何防止扩展导出到 Objective-C 的 Swift 标头?
【发布时间】:2017-06-16 12:18:33
【问题描述】:

我在 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)
    }
}

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

@interface OS_dispatch_queue (SWIFT_EXTENSION(...))
- (void)asyncAfterDelay:(NSTimeInterval)delay block:(void (^ _Nonnull)(void))block;
@end

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

有没有办法防止为 Objective-C 导出扩展?或者有没有办法修复错误?

【问题讨论】:

    标签: ios objective-c swift swift3


    【解决方案1】:

    我知道这不是每个人的答案,但我在使用公共扩展 DispatchQueue 时遇到了同样的问题: dispatch_once after the Swift 3 GCD API changes

    因此,在我的案例中,使用 Vlad 的解决方案帮助我避免了这个持续存在的问题: https://stackoverflow.com/a/41570198/1672521

    【讨论】:

      【解决方案2】:

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

      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)
          }
      }
      

      【讨论】:

      • 它的 '@noobjc' 用于防止......但它并没有解决问题,因为类 'DispatchQueue' 仍然导出到 Objective-C 未知的 'OS_dispatch_queue' 并且它仍然失败。
      猜你喜欢
      • 1970-01-01
      • 2018-03-30
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      • 1970-01-01
      • 2019-03-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多