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