Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 确定范围是否包含值_Swift_Range - Fatal编程技术网

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

我试图找出一种方法来确定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.")
}
就我所知,没有任何内置的方法来完成我想象中的
包含的
方法所做的事情

因此,我尝试扩展
范围
类。不过,我最终还是遇到了泛型的问题。我无法扩展
范围
,因此我必须尝试扩展
范围
本身


我得到的最接近的结果是这个,但它不起作用,因为
=
不需要修改范围,您可以添加这样一个简单的帮助函数

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
    }

}

Plus
Range
已经有了一个
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.")
}