swift

Переменные и константы

Введение

Когда вы начинаете изучать программирование, первое, с чем вы сталкиваетесь — это переменные и константы.

Они являются основой любой программы, как фундамент для дома, как алфавит для языка.

В этой статье мы подробно разберём, что это такое, как с ними работать и почему это так важно, хотя и так просто.

📦 Переменные и константы

Ваш код должен хранить много данных: будь то возраст, имя, список товаров и много многое другое.

⚠️ Поле — Предназначено для хранения состояния. Оно может быть представлено либо переменной (значение допускает изменение), либо константой (значение неизменно и задаётся окончательно).

Представьте, что вам нужно отобразить информацию о пользователе. В таком случае вам не обойтись без следующих полей:

let name = "Иван"
var age = 25
var temperature = 36.6
var isLoggedIn = true

Первая задача, с которой вы можете столкнуться – это выбрать правильный формат хранения.

Тип Ключевое слово Можно изменять Пример
Переменная var ✅ Да var age = 25
Константа let ❌ Нет let name = "Виктория"

Дело в том, что новичкам бывает сложно определиться с тем, какой вариант выбрать.

⚠️ Верный совет Начните с let и как только вы попытаетесь поменять поле – xCode сам подскажет, что это поле должно стать var, вскоре вы поймёте какой из вариантов стоит выбрать изначально.

🎯 Объявление переменных и констант

Переменные (var)

Для создания переменной используется ключевое слово var:

var name = "Иван"
var age = 25
var temperature = 36.6
var score = 0
var isLoggedIn = true

Константы (let)

Для создания константы используется ключевое слово let:

let birthYear = 1998
let pi = 3.14159
let planet = "Земля"
let isWoman = true

Главное отличие в действии

// Переменную можно изменить
var username = "Иван"
username = "Петр" // username теперь – "Пётр" ✅ 

// Константу изменить не получится
let birthCity = "Москва"
birthCity = "Санкт-Петербург"  // ❌ Ошибка! Константу изменить не получится

💡 Почему в Swift есть и переменные, и константы?

Apple создала Swift с акцентом на безопасность. Использование констант помогает:

1. Предотвратить случайные ошибки

// ❌ Плохо - можно случайно изменить важные данные
var userID = "12345"
// ... много кода ...
userID = "67890"  // Ошибка! ID пользователя не должен меняться

// ✅ Хорошо - компилятор защитит от ошибки
let userID = "12345"
// userID = "67890"  // ❌ Ошибка компиляции

2. Сделать код понятнее

// Сразу видно, какие данные могут меняться, а какие нет
let firstName = "Виктория"    // не изменится
let birthDate = "01.01.2000"  // не изменится
var age = 25                  // может измениться
var city = "Москва"           // может измениться

3. Оптимизировать производительность

Компилятор может лучше оптимизировать код с константами, зная, что их значения никогда не изменятся.

🔤 Правила именования полей

Можно использовать:

Нельзя использовать:

Примеры правильных имен:

let firstName = "Анна"
var userAge = 25
var isActive = true

⚠️ Важно! На первый взгляд, кажется, что именования полей, функций и классов это просто, но на самом деле это огромная и важная работа. Только по одним лишь названиям, можно отличить хорошего программиста от посредственного.

Об этом мы ещё поговорим, но уже в другом разделе.

Стили именования

В Swift принято использовать camelCase:

// ❌ Неправильно
let firstname
let FirstName
let first_name

// ✅ Правильно (camelCase)
let firstName
let userLastName
let isUserLoggedIn
let maximumNumberOfItems

🎨 Именование в Swift (Best Practices)

Булевы переменные

Для булевых значений принято использовать префиксы is, has, can, should:

var isLoggedIn = true
var hasAccess = false
var canEdit = true
var isEnabled = false
var shouldUpdate = true
var isCompleted = false
var hasData = true

Понятные имена

// ❌ Плохо
var n = "Анна"
var a = 25
var b = true
var d = 3.14
var arr = [1, 2, 3]

// ✅ Хорошо
var firstName = "Анна"
var userAge = 25
var isStudent = true
var piValue = 3.14
var numbers = [1, 2, 3]

Избегайте сокращений

// ❌ Плохо
var usrNm = "Иван"
var addr = "ул. Ленина"
var calcRes = 42
var tmp = 36.6
var btn = "Кнопка"

// ✅ Хорошо
var username = "Иван"
var address = "ул. Ленина"
var calculationResult = 42
var temperature = 36.6
var buttonTitle = "Кнопка"

Наименования имеют огромное значение, однажды дав плохое имя – вы потратите уйму времени, на то, что бы понять, что делает данный код.

Код имеет тенденцию быстро забываться и чем лучше вы его опишете, тем проще вам будет его понять, когда вы вновь к нему вернётесь – обязательно старайтесь дать как можно более ясное имя как полю, так и функции, классу и всему чему бы то ни было, даже вашему ребёнку.

🔒 Безопасность с константами

Константы делают код безопаснее. Рассмотрим пример:

Плохой пример (используем var для полей, которые не должны меняться)

var userID = "12345"
var userEmail = "user@example.com"
var registrationDate = "2024-01-01"
var userName = "Иван"

// ... много кода ...

// Ошибка! Случайно изменили важные данные
userID = "54321" // ID не должен меняться!
userEmail = "hacker@evil.com"  // Email не должен меняться!

Хороший пример (используем let для неизменяемых данных)

let userID = "12345"
let userEmail = "user@example.com"
let registrationDate = "2024-01-01"
var userName = "Иван"
var userAge = 25

// userName = "Петр" // ✅ Можно
// userAge = 26      // ✅ Можно
// userID = "54321"  // ❌ Ошибка компиляции - поле не планируется менять!

🔄 Изменение значений

Переменные можно менять разными способами

Обратите внимание, что для изменения значения переменной используется одинарный знак равно (=) совсем скоро вы познакомитесь со знаком сравнения (==)

// Значение по умолчанию – 0
var score = 0

// Простое присваивание
score = 10
print(score)  // 10

// Использование текущего значения
score = score + 5
print(score) // 15

// Составные операторы
score += 3   // то же, что score = score + 3
print(score) // 18

score -= 5   // то же, что score = score - 5
print(score) // 13

score *= 2   // то же, что score = score * 2
print(score) // 26

score /= 13  // то же, что score = score / 13
print(score) // 2

Константы изменять нельзя

let maxScore = 100
maxScore = 200  // ❌ Ошибка! Нельзя изменить константу

Переменные можно

var maxScore = 110
maxScore = 220  // ✌️ Всё успешно! Значение изменилось

🎯 Область видимости (Scope)

Переменные и константы существуют только в том блоке кода, где они объявлены:

func example() {
    let localConstant = "Я видна только внутри функции"
    var localVariable = 10
    
    if true {
        let innerConstant = "Я видна только внутри if"
        var innerVariable = 20
        print(localConstant) // ✅ Можно
        print(innerConstant) // ✅ Можно
    }
    
    print(localConstant) // ✅ Можно
    print(innerConstant) // ❌ Ошибка! Не видна за пределами if
}

print(localConstant) // ❌ Ошибка! Не видна за пределами функции

⚠️ Важно! Фигурные скобки – { и } это область внутри которой выполняются действия. Если вы определили поле внутри них – область видимости данного поля ограничена фигурными скобками

Как только вы начнёте практиковаться в коде – вы это уясните, я в вас верю!

🚨 Типичные ошибки новичков

1. Попытка изменить константу

let name = "Анна"
name = "Мария"  // ❌ Ошибка!

2. Использование неинициализированной (созданной не до конца) переменной

var username
print(username)  // ❌ Ошибка! Не инициализирована

// ✅ Правильно
var username = ""
print(username)  // Пустая строка

У вас должна выработаться следующая формула: let / var + подходящее название для поля + тип данных, которое будет хранить данное поле:

var username: String = ""

3. Неправильный тип

var number = 5
number = "пять"  // ❌ Ошибка! Нельзя присвоить строку числу

var text = "hello"
text = 42  // ❌ Ошибка! Нельзя присвоить число строке

4. Игнорирование регистра букв

let userName = "Анна"
print(username) // ❌ Ошибка! Разные имена (userName и username)

// ✅ Правильно
print(userName) // "Анна"

5. Использование var везде

// ❌ Плохо - все var
var firstName = "Анна"
var lastName = "Иванова"
var birthYear = 1998
var age = 25
var city = "Москва"

// ✅ Хорошо - let для неизменяемых
let firstName = "Анна"
let lastName = "Иванова"
let birthYear = 1998
var age = 25
var city = "Москва"

6. Забыли про тип при делении

let a = 5
let b = 2
let result = a / b  // 2 (целочисленное деление!)
// Смотрите – так как мы делим Int на Int – у нас не может получиться Double 
// и в результате 5 / 2 будет равно вовсе не 2.5 а 2

// ✅ Правильно для дробного результата
let result2 = Double(a) / Double(b)  // 2.5

📊 Сравнение: var vs let

Характеристика var let
Можно изменить Да Нет
Безопасность Ниже Выше
Вывод Может меняться Не меняется
Производительность Стандартная Часто лучше
Когда использовать Данные изменяются Данные постоянны

При первых попытках написать код – вы наверняка столкнётесь с трудностями, но чтобы всё прошло гладно – постарайтесь хорошо освоить как данную статью, так и все последюущие.

Код требует строгости в написании и не прощает малейших неточностей 😱😱😱

Всё, что ниже пока не дописал:

Задание 🚀

  1. Создайте структуру, в которой будет храниться информации о студентах и их оценках
  2. Добавьте 2-3 студента, значения оценок выберите сами
  3. Получите информацию о том, какие оценки у “Пети” и “Маши”
  4. Получи список всех ключей (Получится массив из студентов, в статье есть пример как это сделать)
  5. Со звёздочкой Посчитайте средний бал для каждого из студентов в словаре.

Решение можете присылать сюда

Что дальше? 🚀

Поздравляю! Вы освоили Dictionary — мощный инструмент для хранения связанных данных. Теперь вы готовы к изучению:

Тема Описание
Множества (Set) Коллекции уникальных значений
Опционалы Безопасная работа с nil
Функции Создание и использование функций