Menu
Coddy logo textTech

Вычисляемые свойства

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

Хранимое свойство содержит значение. Вычисляемое свойство не имеет хранилища: при каждом чтении оно выполняет код и возвращает значение, вычисленное на основе других свойств:

struct Rectangle {
    var width: Double
    var height: Double

    var area: Double {
        width * height
    }
}

var r = Rectangle(width: 3, height: 4)
print(r.area)
r.width = 10
print(r.area)

Вывод:

12.0
40.0

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

struct Person {
    var first: String
    var last: String

    var fullName: String {
        "\(first) \(last)"
    }
}

var p = Person(first: "Ada", last: "Byron")
p.last = "Lovelace"
print(p.fullName)

Вывод:

Ada Lovelace

Вычисляемое свойство также может иметь сеттер. set получает новое значение как newValue и обновляет хранимые свойства, на которых оно основано:

struct Temperature {
    var celsius: Double

    var fahrenheit: Double {
        get { celsius * 9 / 5 + 32 }
        set { celsius = (newValue - 32) * 5 / 9 }
    }
}

var t = Temperature(celsius: 100)
print(t.fahrenheit)
t.fahrenheit = 32
print(t.celsius)

Вывод:

212.0
0.0

Используй вычисляемое свойство для значения, которое следует из других значений и вычисляется быстро. Используй метод, когда операция принимает аргументы или требует значительных затрат:

struct Order {
    var items: [Int]
    var total: Int { items.reduce(0, +) }           // свойство: без аргументов
    func total(withTax rate: Int) -> Int {           // метод: принимает аргумент
        total + total * rate / 100
    }
}
challenge icon

Задание

Легко

Завершите структуру Circle, добавив хранимое свойство radius и три доступных только для чтения вычисляемых свойства: diameter (удвоенный радиус), area (π r², с использованием Double.pi) и label, которое возвращает r=2.0 d=4.0 a=12.57, округляя площадь до двух десятичных знаков с помощью String(format: "%.2f", area).

Предоставленный код считывает по одному радиусу в каждой строке, создаёт Circle и выводит label. Затем он удваивает радиус последней окружности и снова выводит её label, поэтому значения должны соответствовать радиусу.

Ваш код должен находиться в Circle.swift. В main.swift содержится предоставленный код ввода-вывода, и его нельзя изменять.

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

import Foundation

// Предоставленный код ввода/вывода: оставьте его как есть
var input: [String] = []
while let line = readLine() { input.append(line) }
var last = Circle(radius: 0)
for line in input {
    last = Circle(radius: Double(line)!)
    print(last.label)
}
last.radius *= 2
print(last.label)
quiz iconПроверьте себя

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

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

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