Comments 32
Озвучивалось это?
Swift Programming Language Evolution
Поставлена как первостепенная задача.
Тогда не понятно почему 4.0
Смена мажорной версии обычно говорит об отсутствии обратной совместимости. Простой вопрос. Будет ли 4.0 компилировать 3.* без изменений и "битой семантики"?
to provide source stability for Swift 3 code and to provide ABI stability for the Swift standard library.
Это то, что вы имели ввиду?
Благодарю, я читал эту фразу. Проблема в том, что эта фраза противоречит действиям Эппл, если исходить из общепринятых практик. Общепринятые практики (semver) говорят, что смена мажорной версии — сигнал об обратной несовместимости. Эппл поменяли мажорную версию — по логике 4-я должна иметь проблемы с компиляцией 3-й. Но исходя из их заявления это не так. Тогда зачем было менять мажорную версию? Короче, я подозреваю что разработчикам под экосистему Эппл таки придётся в очередной раз переписывать код.
С семантической и прикладной точки зрения зачем semver в версии языков программирования? Спрашиваю на полном серьёзе, т.к. не понимаю юзкейс (в отличии от использования с библиотеками, как я описал выше).
Под ABI совместимостью имеется в виду, что можно будет линковать фреймворки, написанные на разных версиях Swift, начиная со Swift 4.
То есть не будет такой ситуации, как с Python, когда вы не можете мигрировать на новую версию языка только потому, что все либы заточены под старую. Не компилируется под новой версией Swift? Ну и ладно, укажу в настройках, чтобы только этот модуль компилировался под старой Swift.
Проблема в том, что обычно мажорный релиз языка выпускают с большой подготовкой и редко — с промежутком лет эдак в 10. Питон, как пример, до сих пор тянет 2 ветки. Эппл просто выкидывает на помойку часть того что было ранее. Это не добавляет энтузиазма.
P.S. За удачу благодарствую. Взаимно. :)
Бесспорно, имеет. Но не каждый же год её ломать.
// Swift 2.2
var parameters = [String: AnyObject]()
parameters["skip"] = 0
// Swift 3.0
var parameters = [String: Any]()
parameters["skip"] = 0 as Any? // wtf?
Так что да, миграция с автомигратором Xcode — это очень увлекательное занятие.
Xcode 8.1 ведет себя по-другому
var parameters = [String: AnyObject]()
parameters["skip"] = 0 as AnyObject?
Если вы использовали Xcode 8.0, то я вас понимаю, там действительно было ошибок и предупреждений на два экрана.
Я специально написала про версию Xcode 8.1 и 8.2 — все кардинально изменилось.
Если дадите ссылку на ваш код на Swift 2.2 — буду признательна. Просто хочу убедиться, что миграционный «робот» в Xcode 8.1 и 8.2 улучшился существенно.
Это действительно увлекательно.
В моем случае словарь как был [String: AnyObject] так и остался [String: AnyObject], что не приведет к ошибке при выполнении кода. И это различие важно для выполнения кода без ошибки.
Да, код 0 as AnyObject? мне не нравится, но я же сказала, что «робот» слишком озабочен тем, чтобы сохранить код работоспособным. Иногда это излишне, как в этом случае и в случае приведенном в статье, когда он вставляет кучу лишнего кода, лишь бы сохранить вам возможность сравнивать Optional значения. Поэтому требуется ручная работа.
Зная такую логику работы миграционного «робота», ручные правки кода сделать легко.
Вы определили «значение» для словаря как AnyObject (то есть ссылочный тип), так зачем же задать «0» (value тип)?
var parameters = [String: AnyObject]()
parameters["skip"] = 0 as AnyObject?
или
var parameters = [String: Any]()
parameters["skip"] = 0
Второй вариант мне кажется больше логичным.
Переходим на Swift 3 с помощью миграционного «робота» в Xcode 8.1 и 8.2