我试图找出一种方法来确定一个值是否落入Range
Swift中.
基本上我正在尝试做的是调整其中一个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.") }
据我所知,没有任何内置的方法来做我.contains
上面想象的方法.
所以我试着扩展Range
课程.我最终遇到了泛型问题.我无法延伸Range
所以我不得不尝试扩展Range
自己.
我得到的最接近的是这个,但它不起作用,因为>=
并<=
没有定义ForwardIndex
extension Range { func contains(val:ForwardIndex) -> Bool { return val >= self.startIndex && val <= self.endIndex } }
我该如何添加.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
我对下面提到的〜=运算符很感兴趣; 现在正在调查
你可以与~=
运营商一起做:
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.") }
您也可以直接在交换机中执行此操作:
let point = (1, -1) let (x, y) = point switch x { case 0..5: println("yes") default: println("no") }
~=
是case语句使用的模式匹配运算符.请参阅文档中的详细信息.
使用Swift 3,根据您的需要,您可以选择以下选项之一来确定a Range
,a ClosedRange
,a contains(_:)
或a是否Range
包含值.
ClosedRange
方法CountableRange
,CountableClosedRange
,contains(_:)
并Range
有一个contains(_:)
方法.~=(_:_:)
Range
方法有以下声明:
func contains(_ element: Bound) -> Bool
返回一个布尔值,指示给定元素是否包含在范围内.
用法:
let value: Int = 0 let range = -200 ..< 300 print(range.contains(value)) // prints true
ClosedRange
运营商CountableRange
,CountableClosedRange
,~=(_:_:)
并Range
有一个~=(_:_:)
运营商.Range
ClosedRange
运营商有以下声明:
static func ~= (pattern: Range<Bound>, value: Bound) -> Bool
返回一个布尔值,指示值是否包含在范围中.
用法:
let value = 0 let range = -200 ..< 300 print(range ~= value) // prints true
测试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 }
Range
作为前一个switch语句的替代,您可以使用ClosedRange
:
let value = 0 if case -200 ..< 300 = value { print("OK") // prints "OK" }
因此,为了解决您的问题,您可以使用以下选项之一:
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.") }
let point = (1, -1) if case let (x, y) = point, 0 ..< 5 ~= x { print("(\(x), \(y)) has an x val between 0 and 5.") }