2016-04-14 2 views
1

Я работаю над приложением с двух разных компьютеров. Одна из них - моя домашняя машина, которая является более старым MacBook Pro, но имеет самую последнюю ОС и работает под Xcode 7.3. Вторая машина, которую я использую, - это моя рабочая машина, которая является совершенно новой и молниеносной, но ограничена Yosemite и Xcode 7.2.1.Как написать условный для разных версий Xcode

Недавно я столкнулся с ошибкой сборки на компьютере с Xcode 7.2.1, но приложение строит и запускает без ошибок на машине, работающей с новым Xcode. Я не могу обновить рабочую машину из-за непримиримой ИТ-политики, и я действительно (действительно) не хочу понижать мою домашнюю машину до Xcode 7.2.1.

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

if Xcode.version == 7.3 
    // Run this version of the statement 
    refreshControl.addTarget(self, action: #selector(ReadingTVC.pullToRefreshTableView), forControlEvents: UIControlEvents.ValueChanged) 
if Xcode.version == 7.2.1 
    // Run this different version of the statement 
    // I still need to figure out how to rewrite the statement for 7.2.1 

Возможно ли это? Я нашел следующее в документации Apple, но для версий Xcode не существует. только быстры(), ОС() или арка():

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Statements.html#//apple_ref/doc/uid/TP40014097-CH33-ID539

Заранее спасибо!

+0

мая это поможет - протокол HTTPS : //stackoverflow.com/questions/30790188/how-do-i-see-which-version-of-swift-im-using/46080904#46080904 – Krunal

ответ

1

Вы должны просто использовать swift(), чтобы проверить версию swift, потому что Xcode 7.3 поставляется с Swift 2.2 и Xcode 7.2.1 поставляется с Swift 2.1.x.

Для вашего кода, так как swift() вводится в стремительной 2.2, вам необходимо изменить использовать код, который работает в обеих версиях, которая, как показано ниже (при условии, ReadingTVC является self):

// For both swift 2.1.x and swift 2.2. In swift 2.2, this will pop a 
// warning and ask you to fix. But you can wait until you work computer 
// updated Xcode version to 7.3. You will be force to change when 
// upgrade to swift 3.0 since the old string based api will be removed. 
// Currently it is just marked as deprecated. 
refreshControl.addTarget(self, action: "pullToRefreshTableView", forControlEvents: UIControlEvents.ValueChanged) 
+0

Я пробовал это решение. На моем рабочем компьютере, запускающем Xcode 7.2.1, я получаю сообщение об ошибке: «Неожиданное целевое выражение конфигурации (ожидается« os »или« arch »)« – zeeple

+1

ах, извините, я забыл Xcode 7.2.1 (имеет Swift 2.1.x) не поддерживает 'swift()', он вводится только в swift 2.2. Я обновил свой ответ для этого. Пожалуйста, дайте мне знать, если это сработает. Здесь вы можете увидеть код выпуска Xcode об изменениях: https://developer.apple.com/library/mac/releasenotes/DeveloperTools/RN-Xcode/Chapters/Introduction.html – Zhao

+0

Пятно на. Благодаря! – zeeple

1

Я не могу проверить это в настоящее время, но я думаю, что 7.3 и 7.2.1 также имеют разные версии Swift, поэтому вы можете использовать swift(). Кроме того, я предполагаю, что ошибка связана с изменением Swift (синтаксис #selector?), Так что эта проверка в любом случае подойдет лучше.

PS: вместо #selector (...) более старая версия просто хочет «pullToRefreshTableView» как селектор.

+0

Как вы можете определить, какая версия Swift поставляется с версией Xcode Ты бежишь? В Xcode или в настройках я ничего не могу найти. – zeeple

+1

http://stackoverflow.com/a/30790542 – Darko

1

маленький совет, например за досадную историю струнной ...

 #if swift(>=4.0) 
      let len = text.count 
     #else 
      let len = text.characters.count 
     #endif 

работает в Xcode 8.0 и выше (проверено также в Xcode 9 беты)

Смежные вопросы