Пользовательские операторы диапазона - Swift 4.1 - PullRequest
0 голосов
/ 01 мая 2018

Пользовательские операторы диапазона

Swift 4.1, Xcode 9.3

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


1. <..

  • Этот оператор будет своего рода обратным оператору диапазона ..<.

Моя попытка:

infix operator <.. : RangeFormationPrecedence

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

Ошибка:

1. Custom Range Operator Error

Примечание: Я также получаю информацию о дополнительных 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
}

Ошибка:

2. Custom Range Operator Error

Примечание: Я также получаю информацию о дополнительных 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 Ответ

0 голосов
/ 01 мая 2018

<.. и <.< не являются действительными идентификаторами операторов. Вы найдете подробности в Операторы в справочнике по языку 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.

...