Я построил плагин для 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 для загрузки и установки вручную.
Благодарим за помощь.
Поддержание унаследованной поддержки на языке, который в настоящее время находится в разработке, кажется нелогичным. Из этого немного выиграть, нет причин не быть в последней версии Xcode/Swift. – Alexander
Я нахожусь на последнем Xcode/Swift, но код подключаемого модуля загружается и компилируется сотнями людей по всему миру. Я не могу диктовать свой выбор в среде разработки, и поэтому я хотел бы иметь возможность поддерживать их, если это возможно. У них могут быть веские причины не отходить от приложения, возраст которого меньше года. Я говорю о поддержке Xcode 7.2.1, а не версии 4. – CanadianMacFan
Swift, как сам язык, находится в тяжелом развитии. Ничто не установлено в камне, и многие вещи движутся быстро, даже такие вещи, как базовый синтаксис «Array». Любой, кто хочет писать быстро, понимает, что исходный код и нестабильность ABI будут существовать в значительной степени в течение следующего небольшого промежутка времени. Поддержка чего-то, что бессмысленно. – Alexander