iOS Swift:范围数组

iOS Swift:范围数组,ios,arrays,swift,range,Ios,Arrays,Swift,Range,我有一个Player类,它存储rating类型Int的属性: class Player { typealias Rating: Int var rating: Rating = 0 } 然后,我有各种范围实例,它们指定给定玩家所处的级别: private let level1Range = 0 ..< 100 private let level2Range = 100 ..< 500 switch rating { case level1Range: pr

我有一个
Player
类,它存储
rating
类型
Int
的属性:

class Player {
    typealias Rating: Int
    var rating: Rating = 0
}
然后,我有各种
范围
实例,它们指定给定
玩家所处的
级别

private let level1Range = 0 ..< 100
private let level2Range = 100 ..< 500
switch rating {
case level1Range:
    print("On Level 1")
case level2Range:
    print("On Level 2")
default:
    break
} 
我希望能够说出下一关是什么,以及
玩家距离下一关有多远。

我不确定解决这个问题的最佳方法。我首先制作了一个数组:

private var ratingRanges: [Range] {
    return [level1Range, level2Range]
}
但我得到了一个错误:

对泛型类型“Range”的引用需要中的参数 插入“”

如果这有效,我想我可以找到第一个非零值:

ratingRanges.first(where: { $0.min() - self.rating > 0 })
以便定位下一个范围

还是有更有效的方法来实现这一点?


感谢您的帮助

您需要提供
范围的通用占位符类型

private var ratingRanges: [Range<Rating>] {
    return [level1Range, level2Range]
}
确定下一个范围可以如下所示:

func nextRange() -> Range<Rating>? {
    return ratingRanges.first(where: { $0.lowerBound > rating})
}
func nextRange()->范围?{
返回ratingRanges.first(其中:{$0.lowerBound>rating})
}

您需要提供
范围的通用占位符类型

private var ratingRanges: [Range<Rating>] {
    return [level1Range, level2Range]
}
确定下一个范围可以如下所示:

func nextRange() -> Range<Rating>? {
    return ratingRanges.first(where: { $0.lowerBound > rating})
}
func nextRange()->范围?{
返回ratingRanges.first(其中:{$0.lowerBound>rating})
}

您可以只保留量程的最大值。例如,代替

private let level1Range = 0 ..< 100
private let level2Range = 100 ..< 500

switch rating {
case 0...level1MaxRating:
    print("level 1")
case (level1MaxRating+1)...level2MaxRating:
    print("level 2")
}

可能您应该只保留范围的最大值。例如,代替

private let level1Range = 0 ..< 100
private let level2Range = 100 ..< 500

switch rating {
case 0...level1MaxRating:
    print("level 1")
case (level1MaxRating+1)...level2MaxRating:
    print("level 2")
}

我的解决方案是创建级别枚举:

    enum Level: Int {
    case level1 = 1
    case level2

    init?(rating: Int) {
        switch rating {
        case Level.level1.range:
            self = .level1
        case Level.level2.range:
            self = .level2
        default:
            return nil
        }
    }

    var range: CountableRange<Int> {
        switch self {
        case .level1:
            return level1Range
        case .level2:
            return level2Range
        }
    }
}

我的解决方案是创建级别枚举:

    enum Level: Int {
    case level1 = 1
    case level2

    init?(rating: Int) {
        switch rating {
        case Level.level1.range:
            self = .level1
        case Level.level2.range:
            self = .level2
        default:
            return nil
        }
    }

    var range: CountableRange<Int> {
        switch self {
        case .level1:
            return level1Range
        case .level2:
            return level2Range
        }
    }
}

谢谢你的建议,它看起来确实比公认的答案要复杂一些。谢谢你的建议,它看起来确实比公认的答案要复杂一些。