@_dynamicReplacement(for:) 模拟器错误

@_dynamicReplacement(for: ) error in simulator

我使用 CocoaPods 来管理我的私有组件。现在我有一个组件 Test。 类其中之一的声明如下:

open class Test {

    open dynamic func test() {
        print("test")
    }
}

我对这个组件没有任何问题,它已经在我的私人仓库中了

现在我有另一个名为 Test2 的组件。我想在Test2中使用@_dynamicReplacement(for:)来交换Test中的test()方法如下:

public extension Test {

    @_dynamicReplacement(for: test())
    public func test2() {
        print("test2")
    }
}

现在想把Test2打包成一个pod组件,和Test一样

但是我执行pod spec lint的时候报错:

<unknown>:0: error: fatal error encountered during compilation; please file a bug report with your project and the crash log
<unknown>:0: note: unsupported relocation with subtraction expression, symbol '_$s9MBCRouter6RouterC23MBCNavigationController0cdB010NavigationORszrlE15navigationTest2yyF' can not be undefined in a subtraction expression

我发现这个问题只出现在i386x86_64

我试图创建一个集成了 TestTest2 的项目。

当我在真机上运行它时,它工作正常。但是在模拟器上我运行的时候,报错!

当我将上面的第二段代码放在测试组件中时,它运行没有任何问题。

所以我认为重现这个bug需要满足以下两个条件:

  1. pod B中,使用@_dynamicReplacement(for:)交换其他pod组件中的方法
  2. 运行模拟器中的项目

我发现了这个问题,但是我无法解决,谁能帮忙解决这个问题?非常感谢!


最后说一下我的开发环境

  1. 我使用 CocoaPods 1.9.1、Xcode 11.4 和 Swift 5.2。
  2. 只有 use_frameworks! 在 podfile
  3. 中使用
  4. TestTest2 .podspec 文件集 static_framework = true

要为模拟器构建,您需要将 @objc 属性添加到函数声明中,例如:

open class Test {

    open @objc dynamic func test() {
        print("test")
    }
}

更新:更常见的解决方案(包括泛型)——在构建设置中将编译模式设置为增量,在这种情况下你不需要模拟器根本不需要使用 @objc