Структуры
Часть раздела Объектно-ориентированное программирование путешествия по Swift на Coddy. Урок 7 из 57.
Структура группирует данные и методы подобно классу. Swift создаёт инициализатор со всеми свойствами для каждой структуры, с одним параметром для каждого свойства, поэтому структуре не нужен собственный init:
struct Point {
var x: Int
var y: Int
func distanceFromOrigin() -> Int {
abs(x) + abs(y)
}
}
let p = Point(x: 3, y: -4)
print(p.x)
print(p.distanceFromOrigin())Вывод:
3
7Свойства со значениями по умолчанию можно пропустить в поэлементном инициализаторе:
struct Settings {
var volume = 5
var muted = false
}
let quiet = Settings(volume: 1)
print(quiet.volume)
print(quiet.muted)Вывод:
1
falseСтруктура, хранящаяся в константе let, вообще не может изменяться — даже её свойства var. Чтобы изменить её, сохраните её в var:
let fixed = Point(x: 1, y: 2)
// fixed.x = 5 // ошибка: нельзя присвоить, fixed является константой let
var moving = Point(x: 1, y: 2)
moving.x = 5 // нормальноМногие собственные типы Swift являются структурами: Int, Double, String, Array и Dictionary. Ваши структуры работают так же, как и эти типы: они являются простыми значениями.
struct Money {
var cents: Int
func formatted() -> String {
"\(cents / 100).\(cents % 100 < 10 ? "0" : "")\(cents % 100)"
}
}
print(Money(cents: 1250).formatted())
print(Money(cents: 305).formatted())Вывод:
12.50
3.05Задание
ЛегкоОбъявите структуру Item со свойствами name (String), price (Int, в центах) и quantity (Int). Добавьте метод total(), который возвращает произведение price и quantity, и метод line(), который возвращает 2 x tea = 350.
Предоставленный код считывает один элемент в каждой строке в формате name,price,quantity, создаёт каждый Item с помощью инициализатора по членам и выводит line(). Затем он выводит sum: и сумму всех итоговых значений.
Ваш код должен находиться в Item.swift. В main.swift содержится предоставленный код ввода/вывода, и его нельзя изменять.
Попробуйте сами
// Предоставленный код ввода/вывода: оставьте его как есть
var input: [String] = []
while let line = readLine() { input.append(line) }
var sum = 0
for row in input {
let p = row.split(separator: ",").map(String.init)
let item = Item(name: p[0], price: Int(p[1])!, quantity: Int(p[2])!)
print(item.line())
sum += item.total()
}
print("sum: \(sum)")
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Классы и объекты
Работа с файламиОпределение классовМетоды и selfИнициализаторыКлассы — это ссылкиПовторение — читательский билет4Инкапсуляция
Контроль доступаТолько чтение извнеЗащита состоянияИнициализаторы с возможностью сбояПовторение — банковский счёт7Полиморфизм и обобщения
ПолиморфизмПриведение типовОбобщённые функцииОбобщённые типыПовторение — калькулятор фигур10Паттерны проектирования. Часть 2
Паттерн делегированияПаттерн декораторПаттерн строительПаттерн состояния2Структуры и типы-значения
СтруктурыСемантика значенийИзменяющие методыСтруктура или классПовторение — элемент инвентаря5Наследование
ПодклассыПереопределение методовИнициализаторы и superfinal и иерархииПовторение — иерархия сотрудников8Стандартные протоколы
CustomStringConvertibleEquatableComparableHashableПовторение — пользовательская сортировка11Проект: Управление библиотекой
Книги и читателиВыдача книгПотренируйтесь самостоятельно: Песочница Swift