Какой тип данных у строкового литерала в Swift?

Ответ

Строковый литерал в Swift имеет тип String, который является структурой (value type), а не классом.

Пример и проверка типа:

let greeting = "Hello, World!" // Тип выводится как String
print(type(of: greeting)) // Выводит: String

// Явная аннотация типа
let title: String = "Swift Guide"

Особенности типа String:

  • Это value type, копируемый при присваивании или передаче в функцию.
  • Представляет коллекцию символов Unicode, корректно обрабатывая эмодзи и сложные графемы.
  • Реализует протоколы ExpressibleByStringLiteral, Collection, Equatable, Comparable.
  • Для эффективности работы с подстроками использует тип Substring, который делит буфер памяти с исходной строкой.

Связь с Objective-C: Тип NSString из Foundation является классом (reference type). Swift обеспечивает автоматический мост (bridging) между String и NSString, когда импортируется модуль Foundation.

Ответ 18+ 🔞

А, ну это ж про строки в Swift, да? Вот эта вся ваша "Хэллоу ворлд", блядь. Слушай, тут всё просто, но есть нюансы, ёпта.

Вот смотри, когда ты пишешь какое-нибудь let greeting = "Hello, World!", то это не просто так, блядь, какая-то абстракция. Это у тебя сразу создаётся структурка, тип String. Не класс, сука, а именно структура! Value type, ёбаный в рот! То есть когда ты её куда-то передаёшь или присваиваешь — она, блядь, копируется. Не ссылкой болтается, а честно так, новый экземпляр. Проверить, что за тип вывелся, проще простого:

let greeting = "Hello, World!"
print(type(of: greeting)) // Выведет тебе: String

Можешь, конечно, явно указать, если хочешь быть занудой:

let title: String = "Swift Guide"

А теперь про особенности, блядь, которые надо знать, чтобы не облажаться:

  1. Value type, ёпта. Я уже сказал, но повторю, потому что это важно, как хуй в пальто. Скопировали — и живёте отдельно. Изменил копию — оригинал не пострадал. Красота, блядь.

  2. Unicode внутри, с эмодзи и всей этой хуйнёй. Это не массив каких-то там char'ов, как в старых языках. Там внутри умная система, которая корректно работает с эмодзи (типа этого 🫠), диакритическими знаками и прочими сложными символами. Один "видимый" символ (графема) может состоять из нескольких кодпоинтов Unicode, и String это обрабатывает правильно. Попробуй в старом C так сделать — там бы уже пиздец начался.

  3. Протоколов наворочено — овердохуища. ExpressibleByStringLiteral (чтобы из кавычек создавалось), Collection (чтобы можно было итерироваться), Equatable, Comparable (чтобы сравнивать). Всё из коробки, блядь.

  4. Подстроки (Substring) — хитрая жопа. Вот это, кстати, часто мозг выносит новичкам. Когда ты делаешь срез строки (например, greeting.prefix(5)), тебе возвращается не новая строка, а Substring. Это такая оптимизация, ёпта! Substring делит буфер памяти с оригинальной строкой, чтобы не копировать данные почём зря. Но хранить его долго — плохая идея, потому что он будет держать живьём всю исходную строку. Как только закончил работу — приконвертируй его в нормальную String. Запомни это, а то память сожрёшь.

И про связь с Objective-C, блядь, стариной:

Там, в мире айфонов прошлого, был класс NSString (reference type, то есть ссылочный). Так вот, когда ты импортируешь в Swift-проект модуль Foundation (а ты его почти всегда импортируешь), Swift делает автоматический мост (bridge) между String и NSString. То есть ты можешь передавать String туда, где ожидается NSString, и наоборот — система сама всё подкрутит. Удобно, блядь, но знать об этом надо, а то вдруг где-то поведение чуть поменяется из-за особенностей NSString.

Вот и вся магия, не так страшен чёрт, как его малюют. Главное — помни про value type и про то, что Substring — не вечный спутник, а временная хуйня.