我试图找出一种方法来确定一个值是否在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.")
- }
据我所知,没有任何内在的方式来做我上面想象的.contains方法。
所以我试图扩展Range类。我终于遇到了泛型的问题。我无法扩展范围< Int>所以我不得不尝试扩展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
我对下面提到的〜=运算符非常感兴趣现在看看。
你可以使用〜=操作符:
- let point = (1,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语句使用的模式匹配运算符。查看详细in the docs。