Swift 确定范围是否包含值
我试图找出一种方法来确定Swift中的值是否在Swift 确定范围是否包含值,swift,range,Swift,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
范围内
基本上,我要做的是调整其中一个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.")
}
就我所知,没有任何内置的方法来完成我想象中的包含的方法所做的事情
因此,我尝试扩展范围类。不过,我最终还是遇到了泛型的问题。我无法扩展范围
,因此我必须尝试扩展范围
本身
我得到的最接近的结果是这个,但它不起作用,因为=
和不需要修改范围,您可以添加这样一个简单的帮助函数
let point = (1, -1)
switch point {
case let (x, y) where contains((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.")
}
func contains(range :Range<Int>, x: Int)->Bool{
for num in range{
if(num==x){
return true
}
}
return false
}
let point=(1,-1)
开关点{
小格(x,y),其中包含((0..5),x):
println((\(x),\(y))的x值介于0和5之间。”)
违约:
println(“该点的x值在0和5之外。”)
}
func包含(范围:范围,x:Int)->Bool{
对于范围内的num{
如果(num==x){
返回真值
}
}
返回错误
}
您也可以使用闭包执行类似操作。您可以使用~=
操作符执行此操作:
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语句使用的模式匹配运算符。查看详细信息。我也在看同样的事情,并做了:
let r = 7...9
operator infix ~ {}
func ~ (range:Range<Int>, item:Int) -> Bool{
return item >= range.startIndex && item <= range.endIndex - 1
}
r ~ 9
设r=7…9
运算符中缀{}
func~(range:range,item:Int)->Bool{
return item>=range.startIndex&&item如果要写入包含范围的扩展名,请使用ForwardIndex的距离到来确定给定值是否在范围内
还可以使用特定类型元素
而不是通用协议FowardIndex
作为参数的类型
距离到
和元素
都是范围
定义的一部分
extension Range {
func contains(element: Element) -> Bool {
return startIndex.distanceTo(element) >= 0 && element.distanceTo(endIndex) > 0
}
}
PlusRange
已经有了一个contains
方法,来自扩展序列类型where Generator.Element:equalable
。因此,您无需自己编写就可以使用它。使用Swift 5,根据您的需要,您可以选择以下选项之一来确定Range
(或ClosedRange
)包含一个值
1.包含(:)
方法
Range
,ClosedRange
,CountableRange
和CountableClosedRange
有一个包含(u:)
方法。Range
方法有以下声明:
func contains(_ element: Bound) -> Bool
static func ~= (pattern: Range<Bound>, value: Bound) -> Bool
返回一个布尔值,指示给定元素是否包含在范围内
用法:
let value: Int = 0
let range = -200 ..< 300
print(range.contains(value)) // prints true
let value = 0
let range = -200 ..< 300
print(range ~= value) // prints true
返回一个布尔值,该值指示某个值是否包含在某个范围内
用法:
let value: Int = 0
let range = -200 ..< 300
print(range.contains(value)) // prints true
let value = 0
let range = -200 ..< 300
print(range ~= value) // prints true
4.如果案例
作为上一个switch语句的替代方法,如果case
,则可以使用:
let value = 0
if case -200 ..< 300 = value {
print("OK") // prints "OK"
}
let值=0
如果情况为-200..<300=值{
打印(“确定”)//打印“确定”
}
因此,为了解决您的问题,您可以使用以下选项之一:
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)
开关点{
小格(x,y),其中(0..<5)。包含(x):
打印((\(x),\(y))的x值介于0和5之间。”)
违约:
打印(“该点的x值在0和5之外。”)
}
let point=(1,-1)
如果情况let(x,y)=点,0..<5~=x{
打印((\(x),\(y))的x值介于0和5之间。”)
}
很有趣;知道这个操作符叫什么吗?在ruby中它是=
,被称为“大小写相等操作符”,这是一种特殊的平等性,它的行为可以使案例语句更清晰。因此,也许在这里它被称为相同的东西,但我不确定。除非我遗漏了它,否则它在Swift操作符文档中根本没有提到。@BradDwyer它在苹果的书中被称为“模式匹配”运算符。我知道你是对的。搜索并没有打开它。它肯定超出范围,我确信99%是肯定的。<代码> > <代码>。考虑这一点(对不起一行):<代码>类Fo{{};开关3 {CaseFo.Fi:PrdLn(“Fo”);默认:PrtLnn(“默认”)}/Cux>,给出错误。在Foo.self
上“找不到接受所提供参数的“~=”的重载”,如果我定义@infix func~=(左:AnyClass,右:Int)->Bool
,则该重载是固定的。值得一提的是,它在这里都有文档记录(re:case语句):无需定义函数:contains()
是(现在?)是标准库()的一部分!因为您永远不会有足够的全局函数。
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.")
}