Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 检查一个范围是否在另一个范围内_Swift_Range - Fatal编程技术网

Swift 检查一个范围是否在另一个范围内

Swift 检查一个范围是否在另一个范围内,swift,range,Swift,Range,有没有更简单的方法来检查?如果一个范围在另一个范围之间,这意味着边缘在彼此之间 因此,在您的示例中,它将是largeRange.firstsmallRange.last您可以比较两个范围的下限和上限,或者使用contains函数检查一个范围是否包含另一个范围的两个边界,以了解其中一个是否是另一个范围的子集 smallRange.clamped(to: largeRange) == smallRange // True 我认为您不会找到更简单或更短的编写方法,但您可以定义自己的模式匹配运算符来缩

有没有更简单的方法来检查?

如果一个范围在另一个范围之间,这意味着边缘在彼此之间 因此,在您的示例中,它将是largeRange.firstsmallRange.last

您可以比较两个范围的下限和上限,或者使用contains函数检查一个范围是否包含另一个范围的两个边界,以了解其中一个是否是另一个范围的子集

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