Операторы настраиваемого диапазона - Swift 4.1

Операторы настраиваемого диапазона

Swift 4.1, Xcode 9.3

Я хочу создать два оператора настраиваемого диапазона: <.., <.<


1. <..

  • Этот оператор будет чем-то вроде обратного к оператору диапазона ..<.

Моя попытка:

infix operator <.. : RangeFormationPrecedence

public func <.. (lhs: Int, rhs: Int) -> Range {
    return lhs - 1 ... rhs
}

Ошибки:

Операторы настраиваемого диапазона - Swift 4.1

Примечание: Я также узнал о дополнительных 22 ошибках компиляции, связанных с фактическим объявлением самого настраиваемого оператора (<..).

Идеальное использование:

for i in 1<..9 {
    print(i, terminator: " ")
}

// Prints "0 1 2 3 4 5 6 7 8 9"

2. <.<

  • Я хочу создать своего рода комбинацию моего предыдущего оператора настраиваемого диапазона. <.. и ..<

Моя попытка:

infix operator <.< : RangeFormationPrecedence

public func <.< (lhs: Int, rhs: Int) -> Range {
    return lhs - 1 ..< rhs
}

Ошибки:

Операторы настраиваемого диапазона - Swift 4.1

Примечание: Я также узнал о дополнительных 22 ошибках компиляции, связанных с фактическим объявлением самого настраиваемого оператора (<.<).

Идеальное использование:

for i in 1<.<10 {
    print(i, terminator: " ")
}

// Prints "0 1 2 3 4 5 6 7 8 9"

Как я могу этого добиться?

Кроме того, какой тип Range я должен возвращать?

Наконец, есть ли какие-либо предварительные условия, которые необходимо добавить к самим операторам настраиваемого диапазона для обеспечения безопасности?


Обновлять

Я решил создать два оператора (1x постфиксный, 1x инфиксный) для достижения одной из этих целей:

postfix operator <

public postfix func < <T: Numeric>(n: T) -> T { return n - 1 }


infix operator .< : RangeFormationPrecedence

public func .< <T: Numeric>(lhs: T, rhs: T) -> CountableRange<T> {
    return lhs ..< rhs
}

Тогда я могу:

for i in 1<.<10 {
    print(I, terminator: " ")
}

//Prints "0 1 2 3 4 5 6 7 8 9"

Предостережение: У меня не может быть пробела между числами и операторами (т.е. 1 <.< 10)


Вы должны увеличивать индекс вместо вычитания 1

Leo Dabus 01.05.2018 16:23

Что именно не работает?

BallpointBen 01.05.2018 16:24

Только что обновил вопрос @BallpointBen

Noah Wilder 01.05.2018 16:31
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
250
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

<.. и <.< не являются допустимыми идентификаторами для операторов. Вы найдете подробности в Операторы в справочнике по языку Swift.

Имитация декларации существующих

extension Strideable where Self.Stride : SignedInteger {
    public static func ... (minimum: Self, maximum: Self) -> CountableClosedRange<Self>
}

оператор, ваш первый пользовательский оператор может быть реализован как

infix operator <!! : RangeFormationPrecedence

extension Strideable where Self.Stride : SignedInteger {
    public static func <!! (minimum: Self, maximum: Self) -> CountableClosedRange<Self> {
        return minimum.advanced(by: -1) ... maximum
    }
}

Пример:

for i in 1<!!9 { print(i, terminator: " ") }
// 0 1 2 3 4 5 6 7 8 9

Второй оператор может быть реализован аналогичным образом, используя CountableRange вместо CountableClosedRange.

Зачем мне делать расширение, а не оператора?

Noah Wilder 01.05.2018 19:20

@NoahWilder: Все операторы - это функции. Возникает вопрос: почему метод расширения, а не бесплатная функция? Я только что посмотрел, как определяется .... Вы также можете определить бесплатную функцию public func <!! <T: Strideable> (minimum: T, maximum: T) -> CountableClosedRange<T> where T.Stride: SignedInteger - я не думаю, что это имеет значение.

Martin R 01.05.2018 19:24

Я просто подумал о другом решении; что ты думаешь? Кроме того, у вас есть идеи, как сделать так, чтобы у меня действительно было место? @MartinR

Noah Wilder 01.05.2018 19:47

@NoahWilder: Есть также правила для пробелов вокруг операторов, см., Например, stackoverflow.com/questions/31301715/…. Вот почему for i in 1 <.< 10 не компилируется.

Martin R 01.05.2018 20:23

Не хочу подталкивать @MartinR, но есть ли у вас какие-либо предложения или обходные пути, чтобы сделать что-то вроде того, что я хотел бы сделать?

Noah Wilder 02.05.2018 02:49

@NoahWilder: Я попытался ответить на ваш (начальный) вопрос. <!! был просто примером, демонстрирующим, как можно определить оператор. Существует множество разрешенных символов Unicode, из которых вы можете выбирать. - Определение двух операторов для этой цели (где .< - это просто псевдоним для ..<), на мой взгляд, сбивает с толку и, как вы заметили, имеет «неожиданное» поведение в отношении интервалов.

Martin R 02.05.2018 07:51

Спасибо @MartinR

Noah Wilder 02.05.2018 18:56

Другие вопросы по теме