Классы — это ссылки
Часть раздела Объектно-ориентированное программирование путешествия по 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)Вывод:
4let фиксирует ссылку, а не объект. Константа, содержащая экземпляр класса, не может указывать на другой экземпляр, но свойства экземпляра 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Задание
ЛегкоКоманда использует один общий 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) }
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Классы и объекты
Работа с файламиОпределение классовМетоды и selfИнициализаторыКлассы — это ссылкиПовторение — читательский билет4Инкапсуляция
Контроль доступаТолько чтение извнеЗащита состоянияИнициализаторы с возможностью сбояПовторение — банковский счёт7Полиморфизм и обобщения
ПолиморфизмПриведение типовОбобщённые функцииОбобщённые типыПовторение — калькулятор фигур10Паттерны проектирования. Часть 2
Паттерн делегированияПаттерн декораторПаттерн строительПаттерн состояния2Структуры и типы-значения
СтруктурыСемантика значенийИзменяющие методыСтруктура или классПовторение — элемент инвентаря5Наследование
ПодклассыПереопределение методовИнициализаторы и superfinal и иерархииПовторение — иерархия сотрудников8Стандартные протоколы
CustomStringConvertibleEquatableComparableHashableПовторение — пользовательская сортировка11Проект: Управление библиотекой
Книги и читателиВыдача книгПотренируйтесь самостоятельно: Песочница Swift