Menu
Coddy logo textTech

Структура или класс

Часть раздела Объектно-ориентированное программирование путешествия по 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 }
}
challenge icon

Задание

Легко

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))")
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Песочница Swift