我试图找出一种方法来确定一个值是否落入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语句使用的模式匹配运算符.请参阅文档中的详细信息.
Ima*_*tit 26
使用Swift 3,根据您的需要,您可以选择以下选项之一来确定a Range,a ClosedRange,a contains(_:)或a是否Range包含值.
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)
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)
测试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)
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)
| 归档时间: |
|
| 查看次数: |
14693 次 |
| 最近记录: |