首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自定义范围运算符- Swift 4.1

自定义范围运算符- Swift 4.1
EN

Stack Overflow用户
提问于 2018-05-01 14:20:37
回答 1查看 294关注 0票数 0

自定义范围运算符

Swift 4.1,Xcode 9.3

我想做两个定制的范围操作符:<..<.<

1. <..

  • 这个运算符将是..<范围运算符的逆运算。

我的尝试:

代码语言:javascript
复制
infix operator <.. : RangeFormationPrecedence

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

错误:

注意:--我还得到了另外22条关于自定义操作符(<..)本身的实际声明的编译时错误。

理想用途:

代码语言:javascript
复制
for i in 1<..9 {
    print(i, terminator: " ")
}

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

2. <.<

  • 我想使我以前的自定义范围运算符的某种组合。<....<

我的尝试:

代码语言:javascript
复制
infix operator <.< : RangeFormationPrecedence

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

错误:

注意:--我还得到了另外22条关于自定义操作符(<.<)本身的实际声明的编译时错误。

理想用途:

代码语言:javascript
复制
for i in 1<.<10 {
    print(i, terminator: " ")
}

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

我怎样才能做到这一点?

同样,我应该返回什么样的Range

最后,是否有任何先决条件需要添加到自定义范围操作符本身,以确保安全?

更新

我决定创建两个操作符(1xpostfix,1xinfix)来实现以下目标之一:

代码语言:javascript
复制
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
}

然后我可以做:

代码语言:javascript
复制
for i in 1<.<10 {
    print(I, terminator: " ")
}

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

警告:i不能在数字和运算符之间有一个空格(即1 <.< 10)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-01 16:02:51

<..<.<不是运算符的有效标识符。您可以在Swift语言引用中找到运算符中的详细信息。

模拟已存在的

代码语言:javascript
复制
extension Strideable where Self.Stride : SignedInteger {
    public static func ... (minimum: Self, maximum: Self) -> CountableClosedRange<Self>
}

运算符,您的第一个自定义运算符可以实现为

代码语言:javascript
复制
infix operator <!! : RangeFormationPrecedence

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

示例:

代码语言:javascript
复制
for i in 1<!!9 { print(i, terminator: " ") }
// 0 1 2 3 4 5 6 7 8 9

第二个操作符可以以类似的方式实现,使用CountableRange而不是CountableClosedRange

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50118189

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档