Является ли ключевое слово let потокобезопасным в Swift?

«Является ли ключевое слово let потокобезопасным в Swift?» — вопрос из категории Многопоточность, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, но с важным нюансом.

Ключевое слово let объявляет иммутабельную (неизменяемую) константу. Поскольку значение не может быть изменено после инициализации, чтение этой константы из любого количества потоков абсолютно безопасно — нет риска гонки данных (race condition).

Однако, если let ссылается на экземпляр ссылочного типа (например, класса), потокобезопасность касается только самой ссылки, но не внутреннего состояния объекта. Свойства этого объекта, объявленные как var, могут изменяться, что требует синхронизации.

Примеры:

// 1. Value-типы (безопасно):
let safeInteger: Int = 42
let safeArray: [String] = ["A", "B", "C"]
// Чтение safeInteger или safeArray из любого потока безопасно.

// 2. Reference-типы (требует осторожности):
let myObject = MyClass() // Ссылка иммутабельна, но...
class MyClass {
    var mutableProperty = 0 // ...это свойство можно менять!
}
// Одновременная запись в mutableProperty из разных потоков вызовет гонку данных.

Вывод: let гарантирует потокобезопасность для значения value-типа и для самой ссылки reference-типа. Для обеспечения потокобезопасности изменяемого состояния объекта используйте акторы (actor), очереди (DispatchQueue) или другие механизмы синхронизации.