Класс Swift для нескольких целевых объектов не может компилироваться при вызове целевых функций

#swift

Вопрос:

Чтобы не переписывать один и тот же код для разных целей, у меня есть «Универсальные» классы, доступные для всех целей.

Теперь я столкнулся с проблемой, когда я вызываю API, доступный для одной цели, но не для другой. Меня не волнует функциональность для другого целевого объекта, проблема в том, что код не строится, так как я не могу указать, что код должен вызываться только для «поддерживаемого» целевого объекта.

     @available(iOS 13.0, *)
    func isTestDevice() -> Bool {
        #if canImport(UIKit)
        print("iPhone")
        print(UIDevice.current.identifierForVendor?.uuidString) //Cannot find 'UIDevice' in scope
        return true
        #endif
        return false
    }
 

Как я могу сделать эту функцию «необязательной» таким образом, чтобы на устройствах, поддерживающих UIDevice ее, она возвращала значение true, а для других целей возвращала значение false?

Комментарии:

1. Мои цели-iOS и watchOS. UIDevice доступен только в UIKit, UIKit не доступен на сторожевых. Фактический метод сравнивает UUID устройства с моими устройствами для вывода отладочных данных в производственных сборках.

2. @мэтт тебе нужна дополнительная информация? Я просто хочу проверить идентификатор устройства для iPhone, и если это watchOS, вызывающий эту функцию, верните что-нибудь другое.

Ответ №1:

Ни @available(iOS 13.0, *) то, ни #if canImport другое, похоже, не проверяется во время компиляции по какой-то причине.

Я заставил это работать, сделав

 #if os(iOS)
    print(UIDevice.current.identifierForVendor?.uuidString)
#endif
 

тогда он не пытается компилироваться для других платформ.

Комментарии:

1. Не разглагольствуйте об ЭТОМ в ответе, пожалуйста. Ничего плохого не произошло; вопрос не был отклонен, закрыт или даже подвергнут критике. Законные опасения по поводу жестокого обращения могут быть опубликованы в meta.

2. Сайты Stack Exchange используют оценку из массового источника. Люди могут поднимать, опускать, закрывать голосование. Вопросы могут быть закрыты, и люди могут проголосовать за их повторное открытие. Голоса-это просто голоса; один голос-один из многих, и в конце концов достигается какое-то равновесие. Не следует воспринимать вещи лично или зацикливаться на отдельных событиях, но будьте готовы доверять «мудрости толпы» и учиться на том, что она говорит. Следует также иметь в виду, что ни сайт, ни кто-либо, кто им пользуется, не являются вашими личными слугами. Будьте готовы общаться в комментариях, улучшать вопрос и т. Д. Будьте открыты и дружелюбны. Расслабься. 🙂