Menu
Coddy logo textTech

Методы и 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
challenge icon

Задание

Легко

Завершите класс 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())
quiz iconПроверьте себя

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

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

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