Menu
Coddy logo textTech

Статические члены

Часть раздела Объектно-ориентированное программирование путешествия по 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.0

static 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
2

static 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
}
challenge icon

Задание

Легко

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

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

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

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