Ошибка @_dynamicReplacement (for:) в симуляторе - PullRequest
0 голосов
/ 02 апреля 2020

Я использую CocoaPods для управления моими личными компонентами. Теперь у меня есть компонент Test. Объявление одного из классов выглядит следующим образом:

open class Test {

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

У меня нет проблем с этим компонентом, он уже находится в моем личном репо

Теперь у меня есть другой компонент с именем Test2 , Я хочу использовать @_dynamicReplacement(for:) в Test2 для обмена методом 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

Я обнаружил, что эта проблема появилась только на x86_64 на i386.

I попытался создать проект, который объединяет Test и Test2.

Когда я запускаю его на реальной машине, он работает нормально. Но когда я запускаю его на симуляторе , он сообщает об ошибке!

Когда я поместил второй фрагмент кода выше в компонент Test, он работал без проблем.

Так что я думаю, что для воспроизведения этой ошибки необходимы следующие два условия:

  1. В pod B используйте @_dynamicReplacement(for:) для обмена методами в других компонентах модуля
  2. Запустите проект в симуляторе

Я нашел эту проблему, но не могу ее решить, кто-нибудь может помочь решить эту проблему? Большое спасибо!


Наконец, я хочу поговорить о своей среде разработки

  1. Я использую CocoaPods 1.9.1, Xcode 11.4 и Swift 5.2.
  2. Только use_frameworks! используется в файлах подфайла
  3. Test и Test2 .podspec с набором static_framework = true

1 Ответ

2 голосов
/ 02 апреля 2020

Для построения симулятора необходимо добавить атрибут @objc к объявлению функции, например:

open class Test {

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

ОБНОВЛЕНИЕ: более распространенное решение (включая общие) - установите Режим компиляции на Инкрементальный в настройках сборки, и в этом случае вам вообще не нужно использовать @objc для симулятора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...