自定义范围运算符 - Swift 4.1

时间:2018-05-01 14:20:38

标签: swift range operators operator-precedence infix-operator

自定义范围运算符

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 :(得分:2)

Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Rubberduck.Parsing", "Rubberduck.Parsing\Rubberduck.Parsing.csproj", "{A4A618E1-CBCA-435F-9C6C-5181E030ADFC}" ProjectSection(ProjectDependencies) = postProject + {A2B4E037-A446-41B9-A304-F91C7C7A6972} = {A2B4E037-A446-41B9-A304-F91C7C7A6972} {8CE35EB3-8852-4BA1-84DD-DF3F5D2967B0} = {8CE35EB3-8852-4BA1-84DD-DF3F5D2967B0} EndProjectSection EndProject <..不是运营商的有效标识符。你会找到的 Swift语言参考中的Operators中的详细信息。

模仿现有

的声明
<.<

运营商,您的第一个自定义运营商可以实现为

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