Статические члены
Часть раздела Объектно-ориентированное программирование путешествия по Swift на Coddy. Урок 14 из 57.
Свойство static принадлежит самому типу, а не отдельному экземпляру. Существует ровно одна его копия, к которой обращаются через имя типа:
struct Temperature {
static let freezing = 0.0
static let boiling = 100.0
var celsius: Double
}
print(Temperature.boiling - Temperature.freezing)Результат:
100.0static var может изменяться, поэтому он полезен для данных, общих для всех экземпляров, например для счётчика количества созданных экземпляров:
class Ticket {
static var issued = 0
let number: Int
init() {
Ticket.issued += 1
number = Ticket.issued
}
}
let a = Ticket()
let b = Ticket()
print(a.number)
print(b.number)
print(Ticket.issued)Вывод:
1
2
2static func вызывается у типа. У него нет экземпляра self, с которым можно работать, поэтому он использует только свои аргументы и другие статические элементы. Это хорошее место для вспомогательных функций и именованных способов создания экземпляров:
struct Color {
var red: Int
var green: Int
var blue: Int
static func gray(_ level: Int) -> Color {
Color(red: level, green: level, blue: level)
}
}
let c = Color.gray(128)
print(c.red + c.green + c.blue)Результат:
384Внутри типа Self — это ещё один способ назвать тип, поэтому статические члены можно записывать как Self.issued. Методы экземпляра могут читать статические члены, но статический метод не может читать свойства экземпляра, потому что он не вызывается для экземпляра.
struct Level {
static let maximum = 10
var current = 1
func isMax() -> Bool { current == Self.maximum } // экземпляр читает static
static func describe() -> String { "levels 1-\(maximum)" } // static читает static
}Задание
ЛегкоЗавершите класс Order. Статическое свойство nextId начинается со значения 1, и каждый новый заказ получает текущее значение nextId в качестве своего id, после чего это значение увеличивается. Статическая константа taxPercent равна 10. Метод экземпляра total() возвращает промежуточную сумму плюс налог (с округлением вниз), а статический метод summary(of:) получает массив заказов и возвращает 3 orders, 660 total.
Предоставленный код считывает по одной промежуточной сумме в каждой строке, создаёт заказ для каждой из них, выводит #1: 110 для каждого заказа и в конце выводит сводку.
Ваш код должен находиться в Order.swift. В main.swift содержится предоставленный код ввода/вывода, и его нельзя редактировать.
Попробуйте сами
// Предоставленный код ввода/вывода: оставьте его как есть
var input: [String] = []
while let line = readLine() { input.append(line) }
var orders: [Order] = []
for line in input {
let order = Order(subtotal: Int(line)!)
orders.append(order)
print("#\(order.id): \(order.total())")
}
print(Order.summary(of: orders))
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Классы и объекты
Работа с файламиОпределение классовМетоды и selfИнициализаторыКлассы — это ссылкиПовторение — читательский билет4Инкапсуляция
Контроль доступаТолько чтение извнеЗащита состоянияИнициализаторы с возможностью сбояПовторение — банковский счёт7Полиморфизм и обобщения
ПолиморфизмПриведение типовОбобщённые функцииОбобщённые типыПовторение — калькулятор фигур10Паттерны проектирования. Часть 2
Паттерн делегированияПаттерн декораторПаттерн строительПаттерн состояния2Структуры и типы-значения
СтруктурыСемантика значенийИзменяющие методыСтруктура или классПовторение — элемент инвентаря5Наследование
ПодклассыПереопределение методовИнициализаторы и superfinal и иерархииПовторение — иерархия сотрудников8Стандартные протоколы
CustomStringConvertibleEquatableComparableHashableПовторение — пользовательская сортировка11Проект: Управление библиотекой
Книги и читателиВыдача книг3Свойства: углублённое изучение
Вычисляемые свойстваНаблюдатели свойствСтатические членыПеречисления с методамиПовторение — журнал температурыПотренируйтесь самостоятельно: Песочница Swift