Swift 4.1自定义范围运算符<..与<.<实现求助(Xcode 9.3)
搞定Swift自定义<..和<.<范围运算符的编译错误
嘿,我来帮你解决这个问题!你遇到的一堆编译错误其实根源很明确,咱们先理清楚问题,再一步步实现你想要的功能:
首先,你的原始代码出错主要是两个核心原因:
Range是泛型类型,必须指定具体元素类型(比如Range<Int>),不能直接写Range;- 你用
...创建的是闭区间(ClosedRange),但函数声明返回的是Range(半开区间),类型完全不匹配,编译器自然炸锅了。
接下来我们按照你的需求实现两个自定义运算符:
1. 实现<..运算符(作为..<的反向)
先明确系统..<的行为:a..<b是左闭右开区间,包含a但不包含b,遍历顺序是a, a+1, ..., b-1。
如果<..是它的反向,我猜你想要的是反向遍历这个区间(也就是从b-1倒着走到a),这样用在for循环里就刚好是..<的反向顺序。实现代码如下:
// 先声明运算符,复用系统范围运算符的优先级,避免运算顺序混乱 infix operator <.. : RangeFormationPrecedence // 实现<..:返回..<区间的反向遍历序列 public func <.. (lhs: Int, rhs: Int) -> ReverseCollection<CountableRange<Int>> { return (lhs..<rhs).reversed() }
测试一下:
for i in 5<..10 { print(i) // 会输出:9, 8, 7, 6, 5 }
完美,这就是5..<10的反向遍历效果~
2. 实现<.<运算符
假设你想要的<.<是左开右开区间(也就是只包含大于lhs且小于rhs的数),比如5<.<10能遍历6到9,那代码可以这么写:
// 声明<.<运算符 infix operator <.< : RangeFormationPrecedence // 实现<.<:左开右开的可遍历整数区间 public func <.< (lhs: Int, rhs: Int) -> CountableRange<Int> { // 处理lhs >= rhs的无效情况,返回空区间 guard lhs < rhs else { return 0..<0 } return (lhs + 1)..<rhs }
测试示例:
for i in 5<.<10 { print(i) // 输出:6, 7, 8, 9 }
完整可运行代码
把上面的代码整合起来,在Xcode9.3 Swift4.1里直接就能用:
infix operator <.. : RangeFormationPrecedence infix operator <.< : RangeFormationPrecedence public func <.. (lhs: Int, rhs: Int) -> ReverseCollection<CountableRange<Int>> { return (lhs..<rhs).reversed() } public func <.< (lhs: Int, rhs: Int) -> CountableRange<Int> { guard lhs < rhs else { return 0..<0 } return (lhs + 1)..<rhs } // 测试代码 print("测试<..运算符:") for i in 5<..10 { print(i, terminator: " ") } print("\n测试<.<运算符:") for i in 5<.<10 { print(i, terminator: " ") }
额外说明
如果你想要<..不是反向遍历,而是其他行为(比如左开右闭区间a < x ≤ b),可以随时调整需求再优化~另外,如果要支持Int以外的类型(比如Double),可以把函数改成泛型版本,针对Strideable类型实现就行。
内容的提问来源于stack exchange,提问作者Noah Wilder
相关产品推荐
相关产品推荐

