Menu
Coddy logo textTech

Классы — это ссылки

Часть раздела Объектно-ориентированное программирование путешествия по Swift на Coddy. Урок 5 из 57.

Класс — это ссылочный тип: переменная хранит ссылку на объект, а не его копию. Присваивание экземпляра другой переменной создаёт второе имя для того же объекта:

class Wallet {
    var coins = 10
}

let mine = Wallet()
let alias = mine
alias.coins = 25
print(mine.coins)

Вывод:

25

=== проверяет, указывают ли две ссылки на один и тот же экземпляр. Два отдельных экземпляра являются разными объектами, даже если все их свойства совпадают:

class Wallet {
    var coins = 10
}

let a = Wallet()
let b = a
let c = Wallet()
print(a === b)
print(a === c)

Вывод:

true
false

Функция, которая получает экземпляр, работает с объектом вызывающего кода, поэтому изменения, внесённые внутри функции, остаются видимыми после её завершения:

class Wallet {
    var coins = 10
}

func payFee(_ wallet: Wallet) {
    wallet.coins -= 3
}

let w = Wallet()
payFee(w)
payFee(w)
print(w.coins)

Вывод:

4

let фиксирует ссылку, а не объект. Константа, содержащая экземпляр класса, не может указывать на другой экземпляр, но свойства экземпляра var всё ещё могут изменяться. Массивы экземпляров также содержат ссылки:

class Wallet {
    var coins = 10
}

let shared = Wallet()
let team = [shared, shared]
team[0].coins = 99
print(shared.coins)
print(team[1].coins)

Вывод:

99
99
challenge icon

Задание

Легко

Команда использует один общий Budget. Реализуйте spend(_:amount:) — функцию, которая принимает бюджет и вычитает сумму только в том случае, если средств достаточно, возвращая true, когда трата разрешена. Затем реализуйте runTeam(start:purchases:): создайте один бюджет, позвольте каждой покупке списывать средства из этого же бюджета и верните по одной строке для каждой покупки (ok 30 или denied 80), а затем left 20.

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

Ваш код должен находиться в Budget.swift и Functions.swift. Файл main.swift содержит предоставленный код ввода/вывода, и его нельзя редактировать.

Попробуйте сами

// Предоставленный код ввода/вывода: оставьте его как есть
var input: [String] = []
while let line = readLine() { input.append(line) }
let purchases = input[1].split(separator: ",").map { Int($0)! }
for line in runTeam(start: Int(input[0])!, purchases: purchases) { print(line) }
quiz iconПроверьте себя

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

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

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