0

自定义范围运算符

斯威夫特 4.1,Xcode 9.3

我正在寻找两个自定义范围运算符:<..<.<


1.<..

  • 该运算符将与..<范围运算符相反。

我的尝试:

infix operator <.. : RangeFormationPrecedence

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

错误:

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
}

错误:

2. 自定义范围运算符错误

注意:<.<在自定义运算符 ( ) 本身的实际声明中,我还遇到了另外 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


4

1 回答 1

2

<..并且<.<不是操作员的有效标识符。您将在 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.

于 2018-05-01T16:02:51.670 回答