确定Range是否包含值

Bra*_*yer 25 range swift

我试图找出一种方法来确定一个值是否落入RangeSwift中.

基本上我正在尝试做的是调整其中一个switch语句示例来执行以下操作:

let point = (1, -1)
switch point {
case let (x, y) where (0..5).contains(x):
    println("(\(x), \(y)) has an x val between 0 and 5.")
default:
    println("This point has an x val outside 0 and 5.")
}
Run Code Online (Sandbox Code Playgroud)

据我所知,没有任何内置的方法来做我.contains上面想象的方法.

所以我试着扩展Range课程.我最终遇到了泛型问题.我无法延伸Range<Int>所以我不得不尝试扩展Range自己.

我得到的最接近的是这个,但它不起作用,因为>=<=没有定义ForwardIndex

extension Range {
    func contains(val:ForwardIndex) -> Bool {
        return val >= self.startIndex && val <= self.endIndex
    }
}
Run Code Online (Sandbox Code Playgroud)

我该如何添加.contains方法Range?或者有更好的方法来确定一个值是否在一个范围内?

Edit2:这似乎可以扩展 Range

extension Range {
    func contains(val:T) -> Bool {
        for x in self {
            if(x == val) {
                return true
            }
        }

        return false
    }
}

var a = 0..5
a.contains(3) // true
a.contains(6) // false
a.contains(-5) // false
Run Code Online (Sandbox Code Playgroud)

我对下面提到的〜=运算符很感兴趣; 现在正在调查

gwc*_*fey 39

你可以与~=运营商一起做:

let point = (1, -1)
switch point {
case let (x, y) where (0..5) ~= x:
   println("(\(x), \(y)) has an x val between 0 and 5.")
default:
   println("This point has an x val outside 0 and 5.")
}
Run Code Online (Sandbox Code Playgroud)

您也可以直接在交换机中执行此操作:

let point = (1, -1)
let (x, y) = point
switch x {
case 0..5:
    println("yes")
default:
    println("no")
}
Run Code Online (Sandbox Code Playgroud)

~=是case语句使用的模式匹配运算符.请参阅文档中的详细信息.

  • @BradDwyer这是Apple的书中的"模式匹配"运算符. (3认同)
  • 对于它的价值,这里有所有文件(re:case statements):https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Patterns.html#//apple_ref/doc/UID/TP40014097-CH36-XID_909 (3认同)

Ima*_*tit 26

使用Swift 3,根据您的需要,您可以选择以下选项之一来确定a Range,a ClosedRange,a contains(_:)或a是否Range包含值.


1. ClosedRange方法

CountableRange,CountableClosedRange,contains(_:)Range有一个contains(_:)方法.~=(_:_:) Range方法有以下声明:

func contains(_ element: Bound) -> Bool
Run Code Online (Sandbox Code Playgroud)

返回一个布尔值,指示给定元素是否包含在范围内.

用法:

let value: Int = 0
let range = -200 ..< 300
print(range.contains(value)) // prints true
Run Code Online (Sandbox Code Playgroud)

2. ClosedRange运营商

CountableRange,CountableClosedRange,~=(_:_:)Range有一个~=(_:_:)运营商.Range ClosedRange运营商有以下声明:

static func ~= (pattern: Range<Bound>, value: Bound) -> Bool
Run Code Online (Sandbox Code Playgroud)

返回一个布尔值,指示值是否包含在范围中.

用法:

let value = 0
let range = -200 ..< 300
print(range ~= value) // prints true
Run Code Online (Sandbox Code Playgroud)

3.切换声明

测试a CountableRange,a CountableClosedRange,a if case或a是否if case包含值的一种简单方法是使用switch语句:

let value = 0
switch value {
case -200 ..< 300:
    print("OK") // prints "OK"
default:
    break
}
Run Code Online (Sandbox Code Playgroud)

4.模式匹配 Range

作为前一个switch语句的替代,您可以使用ClosedRange:

let value = 0
if case -200 ..< 300 = value {
    print("OK") // prints "OK"
}  
Run Code Online (Sandbox Code Playgroud)

因此,为了解决您的问题,您可以使用以下选项之一:

let point = (1, -1)
switch point {
case let (x, y) where (0 ..< 5).contains(x):
    print("(\(x), \(y)) has an x val between 0 and 5.")
default:
    print("This point has an x val outside 0 and 5.")
}
Run Code Online (Sandbox Code Playgroud)
let point = (1, -1)
if case let (x, y) = point, 0 ..< 5 ~= x {
    print("(\(x), \(y)) has an x val between 0 and 5.")
}
Run Code Online (Sandbox Code Playgroud)