Ответ
Строковый литерал в 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"
А теперь про особенности, блядь, которые надо знать, чтобы не облажаться:
-
Value type, ёпта. Я уже сказал, но повторю, потому что это важно, как хуй в пальто. Скопировали — и живёте отдельно. Изменил копию — оригинал не пострадал. Красота, блядь.
-
Unicode внутри, с эмодзи и всей этой хуйнёй. Это не массив каких-то там
char'ов, как в старых языках. Там внутри умная система, которая корректно работает с эмодзи (типа этого 🫠), диакритическими знаками и прочими сложными символами. Один "видимый" символ (графема) может состоять из нескольких кодпоинтов Unicode, иStringэто обрабатывает правильно. Попробуй в старом C так сделать — там бы уже пиздец начался. -
Протоколов наворочено — овердохуища.
ExpressibleByStringLiteral(чтобы из кавычек создавалось),Collection(чтобы можно было итерироваться),Equatable,Comparable(чтобы сравнивать). Всё из коробки, блядь. -
Подстроки (
Substring) — хитрая жопа. Вот это, кстати, часто мозг выносит новичкам. Когда ты делаешь срез строки (например,greeting.prefix(5)), тебе возвращается не новая строка, аSubstring. Это такая оптимизация, ёпта!Substringделит буфер памяти с оригинальной строкой, чтобы не копировать данные почём зря. Но хранить его долго — плохая идея, потому что он будет держать живьём всю исходную строку. Как только закончил работу — приконвертируй его в нормальнуюString. Запомни это, а то память сожрёшь.
И про связь с Objective-C, блядь, стариной:
Там, в мире айфонов прошлого, был класс NSString (reference type, то есть ссылочный). Так вот, когда ты импортируешь в Swift-проект модуль Foundation (а ты его почти всегда импортируешь), Swift делает автоматический мост (bridge) между String и NSString. То есть ты можешь передавать String туда, где ожидается NSString, и наоборот — система сама всё подкрутит. Удобно, блядь, но знать об этом надо, а то вдруг где-то поведение чуть поменяется из-за особенностей NSString.
Вот и вся магия, не так страшен чёрт, как его малюют. Главное — помни про value type и про то, что Substring — не вечный спутник, а временная хуйня.