Swift: использование протокола внутри другой цели не может найти некоторые свойства - PullRequest
4 голосов
/ 08 октября 2019

В настоящее время у меня есть большая проблема в моем приложении ios.

Структура нашего проекта выглядит следующим образом:

  • 1 SDK (сторонняя библиотека), написано в Цель-C
  • 1 «Общая» инфраструктура, которая содержит общий код (в целом здесь живет большинство кода и все, что связано с SDK сверху)
  • различные цели для разных клиентов, которыепросто определяем пользовательские цвета и пользовательские изображения для нашей «общей» инфраструктуры.

В общей структуре мы добавили новый протокол для обертывания всех функций SDK, он выглядит примерно так:

protocol SDKRepositoryProtocol {

var oneClassFromSDK : SDKClass123 { get set }
[...]
var otherTestProp: SDKCustomDate { get set } 

}

Так что SDKClass123 и SDKCustomDate являются частными классами из SDK.

Использование класса SDKRepository прекрасно работает в нашей "общей" среде, и большинство наших целей успешно построены без ошибоквообще.

Теперь вот проблема:

Если мы теперь хотим использовать SDKRepositoryProtocol внутри одной из наших целей, IDE поддерживает наше использованиеи IntelliSense показывает все переменные протокола, но если мы хотим скомпилировать наш Swift файл, мы получаем ошибку, подобную:

Value of type 'SDKRepositoryProtocol' has no member 'oneClassFromSDK'.

Примечание:

  • это происходит только в конфигурации сборки Release, а не в DEBUG

И что еще более загадочно, если мы попытаемся получить доступ к repoProtocol.otherTestProp, работающему в обеих конфигурациях сборки.


Итак, затем мы попытались использовать тот же протокол внутри нашего TargetAppDelegate для той же цели (которая все еще написана в Obj-C). И нет проблем с использованием свойства repoProtocol.oneClassFromSDK

Так есть ли другие проблемы, если мы просто создадим новое расширение для TargetAppDelegate (для использования Swift)? Нужно ли нам определять чч. подробнее?


Итак, для меня это выглядит так:

a) компилятор для сборок релиза вызывает проблемы и удаляет свойства, которые, по его мнению, не используются ('oneClassFromSDK')

b) общий SDK не импортируется в цель, потому что oneClassFromSDK нельзя использовать внутри Swift, но otherTestProp компилируется без проблем

c) надеюсь, что у вас естьхорошие идеи


резюме :

  • у нас есть протокол внутри общей структуры
  • внутри AppDelegate ( ObjC ) цели у нас есть доступ ко всем свойствам (сборки Debug & Release)
  • внутри расширения Swift из AppDelegate. У нас нет доступ к некоторым свойствам (не ко всем)и только в Release Build

То, что мы пробовали:

  • некоторые общие вещи: Очистить сборку / Очистить производную папку / Не работает на другомПК
  • мы уже пытались найти различия внутри конфигурации отладки / выпускарацион
    • мы не нашли
    • , мы также пытались просто "перебрать" конфигурацию из другой цели (где мы можем использовать протокол)
  • мы проверили, включен ли файл дважды, поэтому есть два несовпадающих протокола, но внутри нашего файла проекта только один раз
    • мы также попытались переключить целевое членство, потому что это помогло в прошлом сброситьпроблемы внутри файла конфигурации проекта

Редактировать:

Итак, мы можем минимизировать нашу проблему до одного файла:

class MyCustomServiceInTarget: NSObject {
    let shello: SDKClass123
    let repo: SDKRepositoryProtocol

    init(repoProtocol: SDKRepositoryProtocol) {
        self.repo = repoProtocol

        var x = repoProtocol.oneClassFromSDK // Will produce an error 
    }

Итак, внутри этого Сервиса мы получаем ошибку, как указано выше. Служба использовалась внутри Targets AppDelegate, поэтому изначально она тоже там отображалась.

Теперь представьте: Если мы закомментируем строку let shello: SDKClass123 и попытаемся использовать repo.shell собственность снова, это работает !!! : O: O

Кто-нибудь может объяснить это ??

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