【问题标题】:Swift extensions does not work in tests when SDK is in Objective-C当 SDK 在 Objective-C 中时,Swift 扩展在测试中不起作用
【发布时间】:2019-10-21 09:15:03
【问题描述】:

我在 Objective-C 中有 SDK A 可以正常工作。我已经为它创建了扩展,它仍然适用于生产代码。

当我开始测试我的代码并直接使用 SDK 时,一切都很好。当我使用 stacktrace 调用我的扩展时,我的测试失败: file:///%3Cunknown%3E: test failure: SomeTests.testAExtension() failed: failed: caught "NSInvalidArgumentException", “-[A myFun()]: unrecognized selector sent to instance 0x600001a8d3e0…

这是我使用的代码:

// sdk class in Objective-C
class A {
    func sdkFun() {
        // do something
    }
}

extension A {
    func myFun() {
        sdkFun()
    }
}

class SomeTests {

    // O.K.
    func testAFun() {
        let a = A()
        a.sdkFun()
    }

    // Fails with error
    func testA() {
        let a = A()
        a.myFun()
    }
}

我做错了什么? 我使用 Swift 4.2

【问题讨论】:

    标签: ios objective-c swift unit-testing


    【解决方案1】:

    在swift 文件中的extension 前面使用@objc。如下所示

    @objc extension A {
        func myFun() {
            sdkFun()
        }
    }
    

    【讨论】:

      【解决方案2】:

      @objc 具有公共功能和扩展以及您的类。像这样

      @objc public class A {
        @objc public func sdkFun() {
          // do something
        }
      }
      @objc public extension A {
        @objc public func myFun() {
          sdkFun()
        }
      }
      

      【讨论】:

      • 我更新了我的 anwer @jczerski 您还需要添加公共访问说明符。与您的课程和扩展。
      • 还是一样。
      • 可以分享你的代码库吗?因为它对我有用。
      猜你喜欢
      • 2015-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多