Pull to refresh

Comments 11

Добавить сюда баги в диспетчеризации Swift:
https://stackoverflow.com/questions/34847318/swift-protocol-extension-method-dispatch-with-superclass-and-subclass
У нас будет отличный список того, почему Swift - самый упоротый язык из тех, что я встречал
Ну. по крайней мере теперь можно писать some/any Equatable, на это ушло всего каких-то 5 лет развития языка

Ну они пишут у себя в доке, что легкочитаемый, а что там можно натворить с generic они умалчивают))))

Ну читать его действительно легко. А вот писать...

Интересная вещь, попробовал выполнить такой код:

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 рефлексию

Sign up to leave a comment.

Articles