0Pricing
Swift Academy · Урок

Перегрузка операторов и группы приоритетов

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

«Перегрузка операторов и группы приоритетов» — бесплатный урок Swift Academy на CoddyKit. Это урок 1 из 3. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 3 уроков всего.

Зачем настраивать операторы?

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

Перегрузка встроенного оператора

Перегружайте существующий оператор, записывая свободную функцию с тем же символом и вашим типом. Сохраняйте семантику предсказуемой (например, + складывает значения).

struct Vector2D: CustomStringConvertible, Equatable {
    var x: Double
    var y: Double
    var description: String { "(\(x), \(y))" }
}
func + (lhs: Vector2D, rhs: Vector2D) -> Vector2D {
    Vector2D(x: lhs.x + rhs.x, y: lhs.y + rhs.y)
}
func == (lhs: Vector2D, rhs: Vector2D) -> Bool {
    lhs.x == rhs.x && lhs.y == rhs.y
}
let a = Vector2D(x: 1, y: 2)
let b = Vector2D(x: 3, y: 4)
let c = a + b
print(c)     // (4.0, 6.0)

Пользовательский оператор и приоритет

Объявите группу приоритета и назначьте её оператору. Правая ассоциативность разбирает 2 ** 3 ** 2 как 2 ** (3 ** 2).

// Define power operator ** with right-associative precedence
precedencegroup PowerPrecedence {
    higherThan: MultiplicationPrecedence
    associativity: right
}
infix operator ** : PowerPrecedence

// Simple integer exponent (education-only; no overflow checks)
func ** (base: Int, exp: Int) -> Int {
    guard exp >= 0 else { return 0 }   // keep it simple for demo
    if exp == 0 { return 1 }
    var result = 1
    for _ in 0..<exp { result *= base }
    return result
}
print(2 ** 3)          // 8
print(2 ** 3 ** 2)     // 2 ** (3 ** 2) = 2 ** 9 = 512 (right-assoc)

Префиксные и постфиксные операторы

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

prefix operator √
prefix func √ (x: Double) -> Double { x.squareRoot() }

postfix operator !
postfix func ! (x: Bool) -> Bool { !x }  // purely demo; avoid confusing overrides

print(√9)     // 3.0
print(true!)  // false (demo only — don't ship this)

Приоритет на практике

Тщательно выбирайте положение приоритета относительно встроенных приоритетов (например, MultiplicationPrecedence). Проверяйте выражения, чтобы подтвердить их понятность и соответствие замыслу.

// Demonstrate how precedence affects parsing
// Our PowerPrecedence is higher than Multiplication.
// So this parses as: 2 * (3 ** 2) = 18
let r1 = 2 * 3 ** 2
print(r1)

// Compare if we had lower precedence (hypothetical):
// Then it would parse as (2 * 3) ** 2 = 36

Рекомендации

Рекомендации:

  • Предпочитайте методы для нестандартных действий, а операторы оставляйте для привычных математических и побитовых операций.
  • Учитывайте ожидания пользователей (+ складывает, * умножает).
  • Документируйте пользовательские операторы и не расширяйте их набор без необходимости.
  • Определяйте приоритет и ассоциативность, чтобы избежать неоднозначного разбора.

Правильное объявление операторов

Быстрая проверка: как правильно добавить новый оператор с группой приоритета?

Повторение

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

Часто задаваемые вопросы

Урок «Перегрузка операторов и группы приоритетов» бесплатный?

Да — полный текст урока «Перегрузка операторов и группы приоритетов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 3 уроков всего.

Чему я научусь в уроке «Перегрузка операторов и группы приоритетов»?

Перегружайте встроенные операторы для своих типов и определяйте группы приоритетов , чтобы выражения разбирались ожидаемым образом. Сохраняйте дизайн минимальным и предсказуемым. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Swift Academy?

Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 3.

Сколько времени занимает урок «Перегрузка операторов и группы приоритетов»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Swift Academy?

Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Перегрузка операторов и группы приоритетов
  2. Сабскрипты и пользовательские индексы: повторение
  3. Выведение Hashable/Equatable/Comparable
← Назад к Swift Academy