let smallRange = 1..<2
let largeRange = 0..<10
largeRange ~= smallRange // False
为什么要首先编译它??
但如果编译,答案应该是True
下一个代码有效:
smallRange.clamped(to: largeRange) == smallRange // True
有没有更简单的检查方法?
答案 0 :(得分:3)
我认为您不会找到一种“更简单”或更“短”的编写方式,但是您可以定义自己的模式匹配运算符来缩短代码:
extension Range {
static func ~=(lhs: Self, rhs: Self) -> Bool {
rhs.clamped(to: lhs) == rhs
}
}
extension ClosedRange {
static func ~=(lhs: Self, rhs: Self) -> Bool {
rhs.clamped(to: lhs) == rhs
}
}
let smallRange = 1..<2
let largeRange = 0..<10
smallRange ~= largeRange // false
largeRange ~= smallRange // true
注意:之所以进行编译,是因为有一个通用的实现用于检查是否相等,例如切换字符串,因此只有两个范围相同时,它才会返回true。
func ~= <T>(a: T, b: T) -> Bool where T : Equatable
答案 1 :(得分:2)
您似乎有一个有效的公式。那么,为什么不使用它呢?问题解决了。但是,如果您认为自己的工作公式太长,难以记住,无论如何,只要将其重构为扩展名即可,即可将其缩短:
extension Range {
func embraces(_ other: Self) -> Bool {
return other.clamped(to: self) == other
}
}
现在你可以说
largeRange.embraces(smallRange) // true
那更短。更简单随便。
那是编程的一部分。如果您不喜欢该语言,请进行更改。
答案 2 :(得分:1)
您可以比较2个范围的lowerBound
和upperBound
(或使用contains
函数检查一个范围是否包含另一个范围的两个边界),以了解一个范围是否为另一个的子集。
extension Range {
func contains(otherRange: Range) -> Bool {
lowerBound <= otherRange.lowerBound && upperBound >= otherRange.upperBound
}
}
let smallRange = 1..<2
let middleRange = 5..<8
let largeRange = 0..<10
smallRange.contains(otherRange: middleRange) // false
middleRange.contains(otherRange: smallRange) // false
largeRange.contains(otherRange: middleRange) // true
使用contains
的另一种解决方案:
extension Range {
func contains(otherRange: Range) -> Bool {
contains(otherRange.lowerBound) && contains(otherRange.upperBound)
}
}
答案 3 :(得分:0)
好吧,如果一个范围在另一个范围之间,则意味着边缘在彼此之间
因此,在您的示例中,它将是<style name="SwitchCompatStylePrivate" >
<item name="android:thumb">@drawable/switch_thumb</item>
<item name="trackTint">@color/switch_color_private</item>
</style>
<style name="SwitchCompatStylePublic" >
<item name="android:thumb">@drawable/switch_thumb</item>
<item name="trackTint">@color/switch_color_public</item>
</style>