Методы и self
Часть раздела Объектно-ориентированное программирование путешествия по Swift на Coddy. Урок 3 из 57.
Внутри метода self — это экземпляр, для которого был вызван метод. self.count и count обозначают одно и то же свойство, поэтому self обычно опускают:
class Counter {
var count = 0
func increment() {
self.count += 1
}
}
let c = Counter()
c.increment()
print(c.count)Вывод:
1Ключевое слово self необходимо, когда параметр имеет то же имя, что и свойство. Тогда простое имя означает параметр, а self.name означает свойство:
class Player {
var name = "unknown"
func rename(name: String) {
self.name = name
}
}
let p = Player()
p.rename(name: "Ada")
print(p.name)Результат:
AdaМетоды могут вызывать другие методы того же экземпляра, благодаря чему каждый метод остаётся небольшим:
class Cart {
var total = 0
func add(_ price: Int) {
total += price
}
func addTwice(_ price: Int) {
add(price)
add(price)
}
}
let cart = Cart()
cart.addTwice(5)
print(cart.total)Вывод:
10Метод также может возвращать значение, вычисленное на основе свойств. Здесь isEmpty() отвечает на вопрос об экземпляре, не изменяя его:
class Cart {
var items: [String] = []
func add(_ item: String) {
items.append(item)
}
func isEmpty() -> Bool {
items.count == 0
}
}
let cart = Cart()
print(cart.isEmpty())
cart.add("tea")
print(cart.isEmpty())Вывод:
true
falseЗадание
ЛегкоЗавершите класс Thermostat. setTarget(target:) сохраняет параметр в свойстве target (используйте self), warmer() увеличивает значение target на 1, а display() возвращает target: 21.
Предоставленный код считывает начальное значение target и список команд (warmer или set <n>), применяет их и в конце выводит display().
Ваш код должен находиться в Thermostat.swift. В main.swift содержится предоставленный код ввода/вывода, и его нельзя редактировать.
Попробуйте сами
// Предоставленный код ввода/вывода: оставьте его как есть
var input: [String] = []
while let line = readLine() { input.append(line) }
let t = Thermostat()
t.setTarget(target: Int(input[0])!)
for cmd in input.dropFirst() {
if cmd == "warmer" { t.warmer() } else { t.setTarget(target: Int(cmd.dropFirst(4))!) }
}
print(t.display())
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Классы и объекты
Работа с файламиОпределение классовМетоды и selfИнициализаторыКлассы — это ссылкиПовторение — читательский билет4Инкапсуляция
Контроль доступаТолько чтение извнеЗащита состоянияИнициализаторы с возможностью сбояПовторение — банковский счёт7Полиморфизм и обобщения
ПолиморфизмПриведение типовОбобщённые функцииОбобщённые типыПовторение — калькулятор фигур10Паттерны проектирования. Часть 2
Паттерн делегированияПаттерн декораторПаттерн строительПаттерн состояния2Структуры и типы-значения
СтруктурыСемантика значенийИзменяющие методыСтруктура или классПовторение — элемент инвентаря5Наследование
ПодклассыПереопределение методовИнициализаторы и superfinal и иерархииПовторение — иерархия сотрудников8Стандартные протоколы
CustomStringConvertibleEquatableComparableHashableПовторение — пользовательская сортировка11Проект: Управление библиотекой
Книги и читателиВыдача книгПотренируйтесь самостоятельно: Песочница Swift