Swift: флаг командной строки развертывания iOS

Как проверить цель развертывания iOS в инструкции условной компиляции Swift?

Я пробовал следующее:

#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_8_0
    // some code here
#else
    // other code here
#endif

Но первое выражение вызывает ошибку компиляции:

Expected '&&' or '||' expression
+8
источник поделиться
4 ответа

TL; DR? > Перейдите к 3. Решение

1. Предварительная обработка в Swift

Согласно Документация Apple по директивам предварительной обработки:

Компилятор Swift не включает препроцессор. Вместо этого требуется преимущество атрибутов компиляции, построение конфигураций и чтобы реализовать ту же функциональность. Для этого причина, директивы препроцессора не импортируются в Swift.

Вот почему у вас есть ошибка при попытке использовать __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_8_0, которая является директивой предварительной обработки C. С помощью swift вы просто не можете использовать #if с операторами, такими как <. Все, что вы можете сделать, это:

#if [build configuration]

или с условными обозначениями:

#if [build configuration] && ![build configuration]

2. Условное компиляция

Снова из той же документации:

Конфигурации сборки включают в себя литералы истинные и ложные значения, флаги командной строки и функции тестирования платформы, перечисленные в Таблица ниже. Вы можете указать флаги командной строки, используя -D < #flag # > .

  • true и false: не поможет нам
  • функции тестирования платформы: os(iOS) или arch(arm64) > не помогут вам, немного поискать, не могут определить, где они определены. (возможно, в компиляторе?)
  • флаги командной строки. Здесь мы говорим, что единственный вариант, который вы можете использовать...

3. Решение

Чувствует себя как обходной путь, но выполняет работу: Other Swift flags

Теперь, например, вы можете использовать #if iOSVersionMinRequired7 вместо __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_7_0, считая, конечно, что ваша цель - iOS7.

В основном это то же самое, что изменить целевую версию развертывания iOS в вашем проекте, а это менее удобно... Конечно, вы можете использовать несколько конфигураций сборки со связанными схемами в зависимости от целей вашей версии iOS.

Apple, безусловно, улучшит это, возможно, с помощью некоторой встроенной функции, такой как os()...

+11
источник

Протестировано в Swift 2.2

Говоря Deployment Target, вы имеете в виду iOS version или App Target? Ниже я предоставляю решение, если у вас несколько версий приложения (бесплатное приложение, платное приложение...), так что вы используете разные целевые приложения.

Вы можете настроить пользовательские настройки сборки:
1. перейдите в свой проект/выберите свою цель/Настройки сборки/поиск пользовательских флагов
2. для выбранной вами цели установите свой собственный флаг с помощью префикса -D (без пробелов), как для Debug, так и для Release
3. делайте над шагами для каждой вашей цели

введите описание изображения здесь

Чтобы различать цели, вы можете сделать что-то вроде этого:

var target: String {
    var _target = ""
    #if BANANA
        _target = "Banana"
    #elseif MELONA
        _target = "Melona"
    #else
        _target = "Kiwi"
    #endif
    return _target
}

override func viewDidLoad() {
    super.viewDidLoad()
    print("Hello, this is target: \(target)"
}
+6
источник

Вы не можете сделать это в условной инструкции компиляции. "Сложные макросы", как их называет Apple, не поддерживаются в Swift. Дженерики и типы делают то же самое, по их мнению, с лучшими результатами. (Здесь ссылка, которую они опубликовали https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithCAPIs.html#//apple_ref/doc/uid/TP40014216-CH8-XID_13)

Здесь функция, с которой я столкнулся, выполняет ту же самую вещь (и, очевидно, просто заменяет возвращаемые строки тем, что полезно для вас, как логическое или просто сама опция):

func checkVersion(ref : String) -> String {
    let sys = UIDevice.currentDevice().systemVersion
    switch sys.compare(ref, options: NSStringCompareOptions.NumericSearch, range: nil, locale: nil) {
    case .OrderedAscending:
        return ("\(ref) is greater than \(sys)")
    case .OrderedDescending:
        return ("\(ref) is less than \(sys)")
    case .OrderedSame:
        return ("\(ref) is the same as \(sys)")
    }
}

// Usage
checkVersion("7.0") // Gives "7.0 is less than 8.0"
checkVersion("8.0") // Gives "8.0 is the same as 8.0"
checkVersion("8.2.5") // Gives "8.2.5 is greater than 8.0"
0
источник

Я знаю, что ваш вопрос был здесь некоторое время, но на случай, если кто-то все еще ищет ответ, он должен знать, что, начиная с Swift 2.0, вы можете сделать что-то вроде этого:

if #available(iOS 8, *) {
    // iOS 8+ code
} else {
    // older iOS code
}

Подробнее об этом можно узнать здесь.

0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос