🍎 Swift

Classes et structures en Swift

Классы и структуры Swift: value types, reference types и протоколы

В Swift есть два способа создавать свои типы: struct и class. Одна из особенностей Swift — широкое использование структур. Понимание разницы — ключ к хорошему Swift коду!

Аналогия: фотокопия vs Google Doc

  • Struct — как фотокопия документа: изменения в копии не затрагивают оригинал (Value Type)
  • Class — как Google Doc: все видят один документ, изменения одного видны всем (Reference Type)

struct — Value Type

struct Point {
    var x: Double
    var y: Double
    
    func distanceTo(_ other: Point) -> Double {
        let dx = x - other.x
        let dy = y - other.y
        return (dx*dx + dy*dy).squareRoot()
    }
    
    mutating func move(by dx: Double, dy: Double) {
        x += dx; y += dy
    }
}

var point1 = Point(x: 0, y: 0)
var point2 = point1  // Копия!
point2.x = 10

print("point1: (\(point1.x), \(point1.y))") // (0.0, 0.0) — не изменился!
print("point2: (\(point2.x), \(point2.y))") // (10.0, 0.0)

class — Reference Type

class Car {
    var brand: String
    var speed: Double = 0
    
    init(brand: String) { self.brand = brand }
    
    func accelerate(by amount: Double) { speed += amount }
    
    deinit { print("\(brand) удалён из памяти") }
}

var car1 = Car(brand: "Toyota")
var car2 = car1  // Ссылка на ТОТ ЖЕ объект!
car2.speed = 100

print("car1 speed: \(car1.speed)") // 100.0 — изменился!
print(car1 === car2)  // true — это один объект

Computed Properties

struct Rectangle {
    var width: Double
    var height: Double
    
    var area: Double { width * height }
    var perimeter: Double { 2 * (width + height) }
    var diagonal: Double { (width*width + height*height).squareRoot() }
}

var rect = Rectangle(width: 3, height: 4)
print("Площадь: \(rect.area)")      // 12
print("Периметр: \(rect.perimeter)") // 14
print("Диагональ: \(rect.diagonal)") // 5

Property Observers

class Player {
    var name: String
    var score: Int = 0 {
        willSet { print("Счёт изменится с \(score) на \(newValue)") }
        didSet {
            print("Счёт изменился!")
            if score > 100 { print("🏆 Поздравляем! Более 100 очков!") }
        }
    }
    init(name: String) { self.name = name }
}

let player = Player(name: "Герой")
player.score = 50
player.score = 120  // Сработает поздравление!

Extensions

extension Int {
    var squared: Int { self * self }
    var isEven: Bool { self % 2 == 0 }
    func times(_ action: () -> Void) {
        for _ in 0.. String { String(repeating: self, count: n) }
}
print("Я люблю Swift".wordCount) // 3
print("ха".repeated(3))          // хахаха

Protocols

protocol Animal {
    var name: String { get }
    var sound: String { get }
    func makeSound()
}

struct Dog: Animal {
    let name: String
    let sound: String = "Гав!"
    func makeSound() { print("\(name): \(sound)") }
}

struct Cat: Animal {
    let name: String
    let sound: String = "Мяу!"
    func makeSound() { print("\(name): \(sound)") }
}

let animals: [Animal] = [Dog(name: "Шарик"), Cat(name: "Мурзик")]
for animal in animals { animal.makeSound() }

Inheritance (только для class)

class Vehicle {
    var brand: String
    var speed: Double = 0
    init(brand: String) { self.brand = brand }
    func describe() { print("Транспорт: \(brand), скорость: \(speed)") }
}

class ElectricCar: Vehicle {
    var batteryLevel: Double
    init(brand: String, battery: Double) {
        self.batteryLevel = battery
        super.init(brand: brand)
    }
    override func describe() {
        super.describe()
        print("Батарея: \(batteryLevel)%")
    }
}

let tesla = ElectricCar(brand: "Tesla", battery: 80)
tesla.speed = 120
tesla.describe()

struct vs class: когда что использовать

КритерийStructClass
ТипValue (копия)Reference (ссылка)
Наследование❌✅
deinit❌✅
Apple рекомендует✅ По умолчаниюКогда нужно

Правило Apple: Начинай со struct. Переходи на class только если нужно наследование.

Итоги урока

  • struct — value type (копирование), class — reference type (ссылка)
  • Computed properties — вычисляемые свойства
  • Property observers (willSet/didSet) — слежка за изменениями
  • Extensions — добавление функциональности к существующим типам
  • Protocols — контракты для типов
  • Inheritance — наследование только для классов

💪 Дополнительные упражнения

Практика — ключ к успеху в программировании. Чем больше кода ты пишешь, тем лучше ты становишься. Не бойся экспериментировать — ошибки это часть обучения!

  • Напиши программу, которая считает количество гласных в строке
  • Создай функцию, которая проверяет является ли число простым
  • Реализуй простую игру "угадай число" с подсказками
  • Напиши калькулятор с четырьмя операциями
  • Создай программу-органайзер задач (TODO list)

📋 Лучшие практики

Хороший код — это не просто работающий код. Это код, который легко читать, понимать и изменять. Следуй этим принципам:

  • DRY (Don't Repeat Yourself) — не повторяй один и тот же код, выноси его в функции
  • KISS (Keep It Simple, Stupid) — пиши простой и понятный код
  • Именование — переменные должны отражать смысл: userAge лучше чем x
  • Комментарии — комментируй ПОЧЕМУ, а не ЧТО делает код
  • Маленькие функции — каждая функция должна делать одно дело

📚 Полезные ресурсы для дальнейшего изучения

  • Официальная документация — лучший источник правды
  • Stack Overflow — ответы на вопросы программистов
  • GitHub — смотри на реальные проекты с открытым кодом
  • YouTube — видеоуроки для визуальных учеников
  • Практические проекты — создавай что-то настоящее!

💪 Дополнительные упражнения

Практика — ключ к успеху в программировании. Чем больше кода ты пишешь, тем лучше ты становишься. Не бойся экспериментировать — ошибки это часть обучения!

  • Напиши программу, которая считает количество гласных в строке
  • Создай функцию, которая проверяет является ли число простым
  • Реализуй простую игру "угадай число" с подсказками
  • Напиши калькулятор с четырьмя операциями
  • Создай программу-органайзер задач (TODO list)

📋 Лучшие практики

Хороший код — это не просто работающий код. Это код, который легко читать, понимать и изменять. Следуй этим принципам:

  • DRY (Don't Repeat Yourself) — не повторяй один и тот же код, выноси его в функции
  • KISS (Keep It Simple, Stupid) — пиши простой и понятный код
  • Именование — переменные должны отражать смысл: userAge лучше чем x
  • Комментарии — комментируй ПОЧЕМУ, а не ЧТО делает код
  • Маленькие функции — каждая функция должна делать одно дело

📚 Полезные ресурсы для дальнейшего изучения

  • Официальная документация — лучший источник правды
  • Stack Overflow — ответы на вопросы программистов
  • GitHub — смотри на реальные проекты с открытым кодом
  • YouTube — видеоуроки для визуальных учеников
  • Практические проекты — создавай что-то настоящее!

💪 Дополнительные упражнения

Практика — ключ к успеху в программировании. Чем больше кода ты пишешь, тем лучше ты становишься. Не бойся экспериментировать — ошибки это часть обучения!

  • Напиши программу, которая считает количество гласных в строке
  • Создай функцию, которая проверяет является ли число простым
  • Реализуй простую игру "угадай число" с подсказками
  • Напиши калькулятор с четырьмя операциями
  • Создай программу-органайзер задач (TODO list)

📋 Лучшие практики

Хороший код — это не просто работающий код. Это код, который легко читать, понимать и изменять. Следуй этим принципам:

  • DRY (Don't Repeat Yourself) — не повторяй один и тот же код, выноси его в функции
  • KISS (Keep It Simple, Stupid) — пиши простой и понятный код
  • Именование — переменные должны отражать смысл: userAge лучше чем x
  • Комментарии — комментируй ПОЧЕМУ, а не ЧТО делает код
  • Маленькие функции — каждая функция должна делать одно дело

📚 Полезные ресурсы для дальнейшего изучения

  • Официальная документация — лучший источник правды
  • Stack Overflow — ответы на вопросы программистов
  • GitHub — смотри на реальные проекты с открытым кодом
  • YouTube — видеоуроки для визуальных учеников
  • Практические проекты — создавай что-то настоящее!

💪 Дополнительные упражнения

Практика — ключ к успеху в программировании. Чем больше кода ты пишешь, тем лучше ты становишься. Не бойся экспериментировать — ошибки это часть обучения!

  • Напиши программу, которая считает количество гласных в строке
  • Создай функцию, которая проверяет является ли число простым
  • Реализуй простую игру "угадай число" с подсказками
  • Напиши калькулятор с четырьмя операциями
  • Создай программу-органайзер задач (TODO list)

📋 Лучшие практики

Хороший код — это не просто работающий код. Это код, который легко читать, понимать и изменять. Следуй этим принципам:

  • DRY (Don't Repeat Yourself) — не повторяй один и тот же код, выноси его в функции
  • KISS (Keep It Simple, Stupid) — пиши простой и понятный код
  • Именование — переменные должны отражать смысл: userAge лучше чем x
  • Комментарии — комментируй ПОЧЕМУ, а не ЧТО делает код
  • Маленькие функции — каждая функция должна делать одно дело

📚 Полезные ресурсы для дальнейшего изучения

  • Официальная документация — лучший источник правды
  • Stack Overflow — ответы на вопросы программистов
  • GitHub — смотри на реальные проекты с открытым кодом
  • YouTube — видеоуроки для визуальных учеников
  • Практические проекты — создавай что-то настоящее!

💪 Дополнительные упражнения

Практика — ключ к успеху в программировании. Чем больше кода ты пишешь, тем лучше ты становишься. Не бойся экспериментировать — ошибки это часть обучения!

  • Напиши программу, которая считает количество гласных в строке
  • Создай функцию, которая проверяет является ли число простым
  • Реализуй простую игру "угадай число" с подсказками
  • Напиши калькулятор с четырьмя операциями
  • Создай программу-органайзер задач (TODO list)

📋 Лучшие практики

Хороший код — это не просто работающий код. Это код, который легко читать, понимать и изменять. Следуй этим принципам:

  • DRY (Don't Repeat Yourself) — не повторяй один и тот же код, выноси его в функции
  • KISS (Keep It Simple, Stupid) — пиши простой и понятный код
  • Именование — переменные должны отражать смысл: userAge лучше чем x
  • Комментарии — комментируй ПОЧЕМУ, а не ЧТО делает код
  • Маленькие функции — каждая функция должна делать одно дело

📚 Полезные ресурсы для дальнейшего изучения

  • Официальная документация — лучший источник правды
  • Stack Overflow — ответы на вопросы программистов
  • GitHub — смотри на реальные проекты с открытым кодом
  • YouTube — видеоуроки для визуальных учеников
  • Практические проекты — создавай что-то настоящее!

💪 Дополнительные упражнения

Практика — ключ к успеху в программировании. Чем больше кода ты пишешь, тем лучше ты становишься. Не бойся экспериментировать — ошибки это часть обучения!

  • Напиши программу, которая считает количество гласных в строке
  • Создай функцию, которая проверяет является ли число простым
  • Реализуй простую игру "угадай число" с подсказками
  • Напиши калькулятор с четырьмя операциями
  • Создай программу-органайзер задач (TODO list)

📋 Лучшие практики

Хороший код — это не просто работающий код. Это код, который легко читать, понимать и изменять. Следуй этим принципам:

  • DRY (Don't Repeat Yourself) — не повторяй один и тот же код, выноси его в функции
  • KISS (Keep It Simple, Stupid) — пиши простой и понятный код
  • Именование — переменные должны отражать смысл: userAge лучше чем x
  • Комментарии — комментируй ПОЧЕМУ, а не ЧТО делает код
  • Маленькие функции — каждая функция должна делать одно дело

📚 Полезные ресурсы для дальнейшего изучения

  • Официальная документация — лучший источник правды
  • Stack Overflow — ответы на вопросы программистов
  • GitHub — смотри на реальные проекты с открытым кодом
  • YouTube — видеоуроки для визуальных учеников
  • Практические проекты — создавай что-то настоящее!

💪 Дополнительные упражнения

Практика — ключ к успеху в программировании. Чем больше кода ты пишешь, тем лучше ты становишься. Не бойся экспериментировать — ошибки это часть обучения!

  • Напиши программу, которая считает количество гласных в строке
  • Создай функцию, которая проверяет является ли число простым
  • Реализуй простую игру "угадай число" с подсказками
  • Напиши калькулятор с четырьмя операциями
  • Создай программу-органайзер задач (TODO list)

📋 Лучшие практики

Хороший код — это не просто работающий код. Это код, который легко читать, понимать и изменять. Следуй этим принципам:

  • DRY (Don't Repeat Yourself) — не повторяй один и тот же код, выноси его в функции
  • KISS (Keep It Simple, Stupid) — пиши простой и понятный код
  • Именование — переменные должны отражать смысл: userAge лучше чем x
  • Комментарии — комментируй ПОЧЕМУ, а не ЧТО делает код
  • Маленькие функции — каждая функция должна делать одно дело

📚 Полезные ресурсы для дальнейшего изучения

  • Официальная документация — лучший источник правды
  • Stack Overflow — ответы на вопросы программистов
  • GitHub — смотри на реальные проекты с открытым кодом
  • YouTube — видеоуроки для визуальных учеников
  • Практические проекты — создавай что-то настоящее!