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
}
}
}
谢谢你的建议,它看起来确实比公认的答案要复杂一些。谢谢你的建议,它看起来确实比公认的答案要复杂一些。