Структура или класс
Часть раздела Объектно-ориентированное программирование путешествия по Swift на Coddy. Урок 10 из 57.
Рекомендация Swift — начинать со структуры и выбирать класс только тогда, когда вам требуется то, что могут предложить только классы. Структуры проще: каждая переменная владеет собственным значением, поэтому изменение в одном месте никогда не становится неожиданностью для кода в другом месте.
struct Temperature {
var celsius: Double
}
var today = Temperature(celsius: 21)
var yesterday = today
yesterday.celsius = 18
print(today.celsius)Результат:
21.0Выбирайте класс, когда один объект должен быть общим: нескольким частям программы нужно видеть одно и то же изменяющееся состояние, например один банковский счёт, используемый множеством экранов. Классы также поддерживают наследование, чего структуры не делают.
class SharedLog {
var lines: [String] = []
}
let log = SharedLog()
let moduleA = log
let moduleB = log
moduleA.lines.append("A started")
moduleB.lines.append("B started")
print(log.lines.count)Вывод:
2Структуры могут бесплатно получить ==. Добавьте Equatable в объявление, и Swift сравнит каждое свойство; классы вместо этого сравнивают идентичность с помощью ===:
struct Point: Equatable {
var x: Int
var y: Int
}
print(Point(x: 1, y: 2) == Point(x: 1, y: 2))
print(Point(x: 1, y: 2) == Point(x: 2, y: 1))Вывод:
true
falseБыстрая проверка: если два элемента с одинаковыми данными должны считаться одним и тем же объектом, используй struct (точка, цена, дата). Если у элемента есть важная идентичность, даже когда его данные совпадают с данными другого элемента (учётная запись пользователя, открытый файл), используй class.
struct Money { var cents: Int } // 500 центов — это 500 центов
class UserAccount { // два аккаунта могут иметь одно имя
let id: Int
var name: String
init(id: Int, name: String) { self.id = id; self.name = name }
}Задание
ЛегкоPoint — это структура, которую можно сравнивать с помощью ==. Добавьте соответствие протоколу и завершите реализацию countDistinct(_:), которая возвращает количество различных точек в списке (две точки считаются одинаковыми, если обе координаты совпадают).
Предоставленный код считывает по одной точке в каждой строке в формате x,y и выводит distinct: с количеством.
Ваш код должен находиться в Point.swift и Functions.swift. В main.swift находится предоставленный код ввода/вывода, и его нельзя изменять.
Попробуйте сами
// Предоставленный код ввода/вывода: оставьте его как есть
var input: [String] = []
while let line = readLine() { input.append(line) }
let points = input.map { line -> Point in
let p = line.split(separator: ",").map { Int($0)! }
return Point(x: p[0], y: p[1])
}
print("distinct: \(countDistinct(points))")
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Классы и объекты
Работа с файламиОпределение классовМетоды и selfИнициализаторыКлассы — это ссылкиПовторение — читательский билет4Инкапсуляция
Контроль доступаТолько чтение извнеЗащита состоянияИнициализаторы с возможностью сбояПовторение — банковский счёт7Полиморфизм и обобщения
ПолиморфизмПриведение типовОбобщённые функцииОбобщённые типыПовторение — калькулятор фигур10Паттерны проектирования. Часть 2
Паттерн делегированияПаттерн декораторПаттерн строительПаттерн состояния2Структуры и типы-значения
СтруктурыСемантика значенийИзменяющие методыСтруктура или классПовторение — элемент инвентаря5Наследование
ПодклассыПереопределение методовИнициализаторы и superfinal и иерархииПовторение — иерархия сотрудников8Стандартные протоколы
CustomStringConvertibleEquatableComparableHashableПовторение — пользовательская сортировка11Проект: Управление библиотекой
Книги и читателиВыдача книгПотренируйтесь самостоятельно: Песочница Swift