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

时间:2020-09-25 15:02:48

标签: swift range

let smallRange = 1..<2
let largeRange = 0..<10
largeRange ~= smallRange // False

为什么要首先编译它??
但如果编译,答案应该是True

下一个代码有效:

smallRange.clamped(to: largeRange) == smallRange // True

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

4 个答案:

答案 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个范围的lowerBoundupperBound(或使用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>