自定义范围运算符 - Swift 4.1
Custom Range Operators - Swift 4.1
自定义范围运算符
Swift4.1,Xcode9.3
我希望制作两个自定义范围运算符:<..
、<.<
1。 <..
- 此运算符将是
..<
范围运算符的倒数。
我的尝试:
infix operator <.. : RangeFormationPrecedence
public func <.. (lhs: Int, rhs: Int) -> Range {
return lhs - 1 ... rhs
}
错误:
注意: 我还得到了关于自定义运算符实际声明的另外 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
}
错误:
注意: 我还得到了关于自定义运算符实际声明的另外 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"
警告: 我不能在数字和运算符之间使用 space(即 1 <.< 10
)
<..
和 <.<
不是运算符的有效标识符。你会发现
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
而不是 CountableClosedRange
.
自定义范围运算符
Swift4.1,Xcode9.3
我希望制作两个自定义范围运算符:<..
、<.<
1。 <..
- 此运算符将是
..<
范围运算符的倒数。
我的尝试:
infix operator <.. : RangeFormationPrecedence
public func <.. (lhs: Int, rhs: Int) -> Range {
return lhs - 1 ... rhs
}
错误:
注意: 我还得到了关于自定义运算符实际声明的另外 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
}
错误:
注意: 我还得到了关于自定义运算符实际声明的另外 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"
警告: 我不能在数字和运算符之间使用 space(即 1 <.< 10
)
<..
和 <.<
不是运算符的有效标识符。你会发现
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
而不是 CountableClosedRange
.