Clases y estructuras 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: когда что использовать
| Критерий | Struct | Class |
|---|---|---|
| Тип | 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 — видеоуроки для визуальных учеников
- Практические проекты — создавай что-то настоящее!