2016-05-10 2 views
1

Я построил плагин для Xcode, который в первую очередь развертывается через Alcatraz. Эта утилита захватывает источник для моего подключаемого модуля из GitHub, компилирует его и, в случае успеха, устанавливает его в соответствующий каталог. Он работал достаточно хорошо, пока не была выпущена версия 7.3 Xcode с Swift 2.2.Условная компиляция на основе версии Xcode

Swift 2.2 представил новый способ указания селекторов. Раньше вы бы поставить строку с именем функции, такие как это:

NSNotificationCenter.defaultCenter().addObserver(self, selector: "applicationFinishedLoading:", name: NSApplicationDidFinishLaunchingNotification, object: nil) 

Однако новый метод использует #selector следующим образом:

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ColorSenseRainbow.applicationFinishedLoading(_:)), name: NSApplicationDidFinishLaunchingNotification, object: nil) 

Если преобразовать свой код на новый метод, то все люди, которые используют предыдущие версии Xcode (7.2.1 и старше), не смогут использовать мой плагин, потому что он не знает о новом #selector. Я знаю это, потому что я преобразовал его, чтобы избавиться от предупреждений об устаревании, и я получил отзывы от своих пользователей. Однако вполне вероятно, что следующая версия Xcode переместится на Swift 3, и мне придется это сделать.

Так что мой предпочтительный путь - найти способ, чтобы компилятор выбрал код, применимый для версии Xcode. Что-то вроде этого псевдокода.

#if (XCode_Version >= 7.3) 
    // use @selector (ThisClass.functionName) 
#else 
    // use selector: "functionName:" 
#endif 

Я знаю, что скор функция(), который может быть использован, чтобы сказать версию, но которая была введена только с Swift 2.2 и если я использую, что компиляция потерпит неудачу на Xcode 7.2.1 и ниже. Это оставляет меня в том же месте, что и раньше, с помощью функции @selector.

Другой вариант - снять выпуск, который я собираюсь сделать, и сделать его последним с помощью селектора: метод «functionName:». После этого у меня будет копия, которая предварительно скомпилирована на GitHub для пользователей более старых версий Xcode для загрузки и установки вручную.

Благодарим за помощь.

+0

Поддержание унаследованной поддержки на языке, который в настоящее время находится в разработке, кажется нелогичным. Из этого немного выиграть, нет причин не быть в последней версии Xcode/Swift. – Alexander

+0

Я нахожусь на последнем Xcode/Swift, но код подключаемого модуля загружается и компилируется сотнями людей по всему миру. Я не могу диктовать свой выбор в среде разработки, и поэтому я хотел бы иметь возможность поддерживать их, если это возможно. У них могут быть веские причины не отходить от приложения, возраст которого меньше года. Я говорю о поддержке Xcode 7.2.1, а не версии 4. – CanadianMacFan

+0

Swift, как сам язык, находится в тяжелом развитии. Ничто не установлено в камне, и многие вещи движутся быстро, даже такие вещи, как базовый синтаксис «Array». Любой, кто хочет писать быстро, понимает, что исходный код и нестабильность ABI будут существовать в значительной степени в течение следующего небольшого промежутка времени. Поддержка чего-то, что бессмысленно. – Alexander

ответ

0

Поскольку Swift поддерживает условную компиляцию, вы можете установить свои собственные условия.

Используйте что-то вроде #if SWIFT_2_0 и определите -D SWIFT_2_0 в проекте, который должен использовать более старую версию Swift.

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