确定Range是否包含值

 mobiledu2502863723 发布于 2023-01-11 19:13

我试图找出一种方法来确定一个值是否落入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.")
}

据我所知,没有任何内置的方法来做我.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

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

2 个回答
  • 你可以与~=运营商一起做:

    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语句使用的模式匹配运算符.请参阅文档中的详细信息.

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


    1. 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
    

    2. 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
    

    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
    }
    

    4.模式匹配 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.")
    }
    

    2023-01-11 19:14 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有