~Copyable: move-only значения с настоящим deinit 🪧

🧵 Пометили структуру как ~Copyable — сказали компилятору, что у значения уникальная идентичность: его можно передвинуть или одолжить, но нельзя неявно скопировать. Главное, ради чего это стоит смотреть: у такой структуры может быть deinit. Обычные value-типы в Swift его иметь не могут, а noncopyable — могут, и он вызывается детерминированно в конце времени жизни уникального экземпляра. Отсюда и весь смысл: файловые дескрипторы, сокеты, GPU-буферы. borrowing — функция пользуется значением, но владение остаётся у вызывающего. consuming — владение уходит, и исходная переменная становится недействительной.

⚠️ Две поправки к тому, что обычно пишут. Первая: это не Swift 6, а Swift 5.9 (SE-0390 + SE-0377); Swift 6.0 (SE-0427) уже обобщил их на дженерики, протоколы и Optional. Вторая: сравнение с Rust хромает — в Swift нет borrow checker'а и нет аннотаций времён жизни, их только проектируют (SE-0446 про ~Escapable явно откладывает их на будущий пропозал).

#Swift #Swift6 #Ownership #MoveOnly #MemorySafety

~Copyable: move-only значения с настоящим deinit 🪧 | Сетка — социальная сеть от hh.ru