Swift 检查一个范围是否在另一个范围内
有没有更简单的方法来检查?如果一个范围在另一个范围之间,这意味着边缘在彼此之间 因此,在您的示例中,它将是largeRange.firstSwift 检查一个范围是否在另一个范围内,swift,range,Swift,Range,有没有更简单的方法来检查?如果一个范围在另一个范围之间,这意味着边缘在彼此之间 因此,在您的示例中,它将是largeRange.firstsmallRange.last您可以比较两个范围的下限和上限,或者使用contains函数检查一个范围是否包含另一个范围的两个边界,以了解其中一个是否是另一个范围的子集 smallRange.clamped(to: largeRange) == smallRange // True 我认为您不会找到更简单或更短的编写方法,但您可以定义自己的模式匹配运算符来缩
smallRange.clamped(to: largeRange) == smallRange // True
我认为您不会找到更简单或更短的编写方法,但您可以定义自己的模式匹配运算符来缩短代码:
extension Range {
func contains(otherRange: Range) -> Bool {
contains(otherRange.lowerBound) && contains(otherRange.upperBound)
}
}
注意:它之所以能够编译,是因为有一个通用实现用于检查相等性,如切换字符串,因此只有当两个范围相同时,它才会返回true
let smallRange = 1..<2
let largeRange = 0..<10
smallRange ~= largeRange // false
largeRange ~= smallRange // true
你似乎有一个有效的公式。那么为什么不直接使用它呢?问题解决了。但是,如果您认为您的工作公式太长、难以记住,那么只需将其重构为一个扩展,以便缩短它:
func ~= <T>(a: T, b: T) -> Bool where T : Equatable
现在你可以说
extension Range {
func embraces(_ other: Self) -> Bool {
return other.clamped(to: self) == other
}
}
那更短。更简单。不管怎样
这就是编程的一部分。如果你不喜欢这种语言,就改变它。更简单?这听起来像是一个意见问题。@matt Ok:shorter-way,所以重构并给整个工作公式起一个简短的名字。我在这里的理念与。当然,asyncAfterdeadline:now+n很容易说。但是delayn更容易,所以为什么不改变语言,这样你就可以说出来呢?显然,全世界都同意,因为几乎每个人都这么说。我有一个代码片段库,可以嵌入到任何项目中,这样我就可以随心所欲地说话了。下面是其中的一些:覆盖~=不会影响范围的切换行为吗?也许它比~=override contains更安全。这不是通用的,所以它只适用于范围。只有你回答了为什么它会编译:其他人都忽略了这一点question@Roman如果您需要切换一个范围并检查不同的范围,它将匹配适合大范围的所有范围。我从未需要切换一个范围来检查其他范围是否等于it@Roman实际上恰恰相反,如果切换一个小范围,它将匹配包含它的所有较大范围。
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
func ~= <T>(a: T, b: T) -> Bool where T : Equatable
extension Range {
func embraces(_ other: Self) -> Bool {
return other.clamped(to: self) == other
}
}
largeRange.embraces(smallRange) // true