Comments 11
Добавить сюда баги в диспетчеризации Swift:
https://stackoverflow.com/questions/34847318/swift-protocol-extension-method-dispatch-with-superclass-and-subclass
У нас будет отличный список того, почему Swift - самый упоротый язык из тех, что я встречал
Ну. по крайней мере теперь можно писать some/any Equatable, на это ушло всего каких-то 5 лет развития языка
Интересная вещь, попробовал выполнить такой код:
func firstFunc(name: any Equatable) {
var temp = name
temp = "world"
NSLog("Hello \(temp)")
}
firstFunc(name: 3)
Думал, сломается, но temp сначала создается как Int, а после присваивания стал String - оказывается, в Свифте тип на лету может поменяться
Тип не поменялся. У Вас же написано – any Equatable
. Он и остался any Equatable
. В этой переменной лежит значение любого типа, реализующего Equatable
, и это единственная гарантия, которую такая декларация предоставляет. А то есть вон вообще вот такой срыв покровов)
var a: Any = "a string"
a = 5
a = "and a string again!"
Просто я полагал, что переменная при иницализации получает конкретный тип и он уже не может меняться. Выходит, что some так работает (по сути, синтаксический сахар для шаблона), а вот any - полностью динамический и конкретный тип может меняться (конечно, если удовлетворяет протоколу)
ну тут да, опять же потому что any написано, оно одобряет все, что подходит под Equatable
Это нововведение в Swift 5.6, раньше действительно было нельзя написать temp = name
Вот так пишешь приложение (особенно в первые дни языка, портируя код с ObjC), и решаешь на свой интерфейс-теперь-протокол повесить Equitable. И у тебя не компилится половина кода, потому что твой протокол больше не "concrete type", а "generic constraint" и с практической точки зрения вообще не существует
В первые дни языка вообще весело было) Swift 1 -> 2 и Swift 2 -> 3 оба раза морозили всю работу на несколько дней, идущих на то, чтобы проект хотя бы снова собирался :)
Вообще первые пару лет я Swift старательно избегал, с критерием "я не коснусь его пока они в течении 2х мажорных версий не сломают ничего мажорного".
Формально этот критерий ещё не выполнен, ждём swift 6.
Имхо, Swift развивается очень медленно и очень хаотично. У нас сейчас 4 способа (включая "универсальные") описать keypath, а вот писать с его использованием в не-ObjC совместимые типы нельзя до сих пор. Мне тут периодически в спорах в достоинства Swift приводят рефлексию, которой по факту в Swift нет, всё, что есть - это bridging на ObjC рефлексию
Топ 3 необычных вопроса на собеседовании iOS разработчика