Подтвердить что ты не робот

Как я могу программно найти версию Swift?

Я знаю, что могу найти версию Swift, с которой я сейчас работаю, вернувшись к терминалу и набрав:

xcrun swift --version
Swift version 1.1 (swift-600.0.57.4)
Target: x86_64-apple-darwin13.4.0

Кроме того, я читал о Макросах препроцессора в Swift, но не повезло найти константу версии Swift.

По мере приближения Swift 1.2 будет полезно отметить старый код, который работает только на Swift 1.1 (Xcode до 6.2) или новый код, для которого требуется Xcode 6.3 (Swift 1.2)

Примечание. Я также могу использовать system(), чтобы сделать что-то вроде:

system("xcrun swift --version | grep version > somefile.txt")

Затем откройте файл somefile.txt, но скорее предпочтете более простое решение

4b9b3361

Ответ 1

Наконец-то появилось обходное решение для этого. Я использую константы с префиксом __, которые вы можете наблюдать на своей игровой площадке. Это было бы легче с некоторым уровнем отражения, но...

__IPHONE_OS_VERSION_MAX_ALLOWED составляет 80200, что означает __IPHONE_8_2 для Xcode 6.2 (Swift 1.1), но его значение составляет 80300 (__IPHONE_8_3) в Xcode 6.3 (Swift 1.2)

func isSwift12() -> Bool {
  return __IPHONE_OS_VERSION_MAX_ALLOWED == 80300
}

isSwift12()

Итак, теперь в вашей библиотеке вы можете быстро выйти и сказать, что ваша версия Swift неверна, используя это:

assert(isSwift12(), "Need Swift 12")

Swift даст вам приятное:

утверждение не выполнено: Need Swift 12: файл, строка 20

ОБНОВЛЕНИЕ WWDC 2015 - Swift 2.0

Как указано в Apple Swift blog, в Swift 2.0 у нас есть #available блоки для проверки определенных версий ОС в нашем коде. Примером может быть:

if #available(OSX 10.11, *) {
    monochromeFilter!.setValue(CIColor(red: 0.5, green: 0.5, blue: 0.5), forKey:kCIInputColorKey)
} else {
    // Fallback on earlier versions
}

Ответ 2

Вы можете использовать директивы условной компиляции для проверки конкретной версии Swift, используемой для построения вашего проекта:

#if swift(>=5.0)
print("Hello, Swift 5!")
#elseif swift(>=4.0)
print("Hello, Swift 4!")
#elseif swift(>=3.0)
print("Hello, Swift 3!")
#elseif swift(>=2.2)
print("Hello, Swift 2.2!")
#elseif swift(>=2.1)
print("Hello, Swift 2.1!")
#endif

Ответ 3

Swift 3.1 расширяет атрибут @available, чтобы поддерживать указание номеров версии Swift в дополнение к существующим версиям платформы.

// Swift 3.1

@available(swift 3.1)
func intVersion(number: Double) -> Int? {
  return Int(exactly: number)
}

@available(swift, introduced: 3.0, obsoleted: 3.1)
func intVersion(number: Double) -> Int {
  return Int(number)
}

Ответ 4

Из вашего комментария:

Я хочу проверить, потому что разные версии Swift имеют разные функции.

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

if (self.respondsToSelector(Selector("yourMethodSelector"))) {
    self.yourMethodSelector(test, sender: self)
} else {
    //error handling
}

Просто проверьте, доступен ли метод или нет.

Ответ 5

Для iOS:

var systemVersion = UIDevice.currentDevice(). systemVersion;

Для OSX:

var systemVersion = NSProcessInfo.processInfo(). operatingSystemVersion;

К.