switch case范围判断


	const  int i = 3;
	  
      switch (true)
       {
          case (i < 5):
       				cout<<"小于5"<<endl;
          			break;
          case( i > 5):
        			cout<<"大于5"<<endl;
          			break;
           default:
          		   	break;
      }

有其他方法巧妙的加入范围判断的 可以贴出来讨论讨论

有同事用过后发现了问题 , switch判断式为bool类型 ,所以在case中实际上是 判断两个状态 0和1。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
Swifter-Swift 开发者必备 Tips (第四版),王巍版本 柯里化 (Currying) Swift 里可以将方法进行柯里化 (Currying),这是也就是把接受多个参数的方法进行一些变形,使其更加灵活的方法。函数式的编程思想贯穿于 Swift ,而函数的柯里化正是这门语言函数式特点的重要表现。 举个例子,下面的函数简单地将输入的数字加 1: func addOne(num: Int) -> Int { return num + 1 } 这个函数所表达的内容非常有限,如果我们之后还需要一个将输入数字加 2,或者加 3 的函数,可能不得不类似地去定义返回为 num + 2 或者 num + 3 的版本。有没有更通用的方法呢?我们其实可以定义一个通用的函数,它将接受需要与输入数字相加的数,并返回一个函数。返回的函数将接受输入数字本身,然后进行操作: func addTo(_ adder: Int) -> (Int) -> Int { return { num in return num + adder } } 有了 addTo,我们现在就能轻易写出像是 addOne 或者 addTwo 这样的函数了: let addTwo = addTo(2) // addTwo: Int -> Int let result = addTwo(6) // result = 8 再举一个例子,我们可以创建一个比较大小的函数: func greaterThan(_ comparer: Int) -> (Int) -> Bool { return { $0 > comparer } } let greaterThan10 = greaterThan(10); greaterThan10(13) // => true greaterThan10(9) // => false 柯里化是一种量产相似方法的好办法,可以通过柯里化一个方法模板来避免写出很多重复代码,也方便了今后维护。 举一个实际应用时候的例子,在 Selector 一节,我们提到了在 Swift Selector 只能使用字符串在生成。这面临一个很严重的问题,就是难以重构,并且无法在编译期间进行检查,其实这是十分危险的行为。但是 target-action 又是 Cocoa 如此重要的一种设计模式,无论如何我们都想安全地使用的话,应该怎么办呢?一种可能的解决方式就是利用方法的柯里化。Ole Begemann 在这篇帖子里提到了一种很好封装,这为我们如何借助柯里化,安全地改造和利用 target-action 提供了不少思路。 protocol TargetAction { func performAction() } struct TargetActionWrapper: TargetAction { weak var target: T? let action: (T) -> () -> () func performAction() -> () { if let t = target { action(t)() } } } enum ControlEvent { case TouchUpInside case ValueChanged // ... } class Control { var actions = [ControlEvent: TargetAction]() func setTarget(target: T, action: @escaping (T) -> () -> (), controlEvent: ControlEvent) { actions[controlEvent] = TargetActionWrapper( target: target, action: action) } func removeTargetForControlEvent(controlEvent: ControlEvent) { actions[controlEvent] = nil } func performActionForControlEvent(controlEvent: ControlEvent) { actions[controlEvent]?.performAction() } } 模式匹配 在之前的正则表达式,我们实现了 =~ 操作符来完成简单的正则匹配。虽然在 Swift 没有内置的正则表达式支持,但是一个和正则匹配有些相似的特性其实是内置于 Swift 的,那就是模式匹配。 当然,从概念上来说正则匹配只是模式匹配的一个子集,但是在 Swift 里现在的模式匹配还很初级,也很简单,只能支持最简单的相等匹配和范围匹配。在 Swift 使用 ~= 来表示模式匹配的操作符。如果我们看看 API 的话,可以看到这个操作符有下面几种版本: func ~=(a: T, b: T) -> Bool func ~=(lhs: _OptionalNilComparisonType, rhs: T?) -> Bool func ~=(pattern: I, value: I.Bound) -> Bool 从上至下在操作符左右两边分别接收可以判等的类型,可以与 nil 比较的类型,以及一个范围输入和某个特定值,返回值很明了,都是是否匹配成功的 Bool 值。你是否有想起些什么呢..没错,就是 Swift 非常强大的 switch,我们来看看 switch 的几种常见用法吧: 可以判等的类型的判断 let password = "akfuv(3" switch password { case "akfuv(3": print("密码通过") default: print("验证失败") } 对 Optional 的判断 let num: Int? = nil switch num { case nil: print("没值") default: print("\(num!)") } 对范围判断 let x = 0.5 switch x { case -1.0...1.0: print("区间内") default: print("区间外") } 这并不是巧合。没错,Swift 的 switch 就是使用了 ~= 操作符进行模式匹配,case 指定的模式作为左参数输入,而等待匹配的被 switch 的元素作为操作符的右侧参数。只不过这个调用是由 Swift 隐式地完成的。于是我们可以发挥想象的地方就很多了,比如在 switch case 判断的时候,我们完全可以使用我们自定义的模式匹配方法来进行判断,有时候这会让代码变得非常简洁,具有条理。我们只需要按照需求重载 ~= 操作符就行了,接下来我们通过一个使用正则表达式做匹配的例子加以说明。 首先我们要做的是重载 ~= 操作符,让它接受一个 NSRegularExpression 作为模式,去匹配输入的 String: func ~=(pattern: NSRegularExpression, input: String) -> Bool { return pattern.numberOfMatches(in: input, options: [], range: NSRange(location: 0, length: input.characters.count)) > 0 } 然后为了简便起见,我们再添加一个将字符串转换为 NSRegularExpression 的操作符 (当然也可以使用 StringLiteralConvertible,但是它不是这个 tip 的主题,在此就先不使用它了): prefix operator ~/ prefix func ~/(pattern: String) -> NSRegularExpression { return NSRegular[removed]pattern: pattern, options: nil, error: nil) } 现在,我们在 case 语句使用正则表达式的话,就可以去匹配被 switch 的字符串了:
1、异常捕获 我们在程序经常会出现各种各样的异常,你如果想要你的程序变得坚强一些。 在你的代码应该经常性的使用try-catch来进行异常捕获。 哪行代码有可能出现异常,你就踹它一脚。 语法: try { 可能会出现异常的代码; .... ... ... } //try和catch之间不能有其他的代码 catch { 出现异常后要执行的代码; } 执行过程:如果try的代码没有出现异常,那么catch的代码不会执行。 如果try的代码出现了异常,那怕这行出现异常的代码后面还有一百行都不会执行了, 而是直接跳到catch执行代码 2、变量的作用域 变量的作用域就是你能够使用到这个变量的范围。 变量的作用域一般从声明它的那个括号开始到那个括号所对应的结束的括号结束。 在这个范围内,我们可以访问并使用变量。超出这个范围就访问不到了 3、switch-case 用来处理多条件的定值的判断。 语法: switch(变量或者表达式的值) { case 值1:要执行的代码; break; case 值2:要执行的代码; break; case 值3:要执行的代码; break; .......... default:要执行的代码; break; } 执行过程:程序执行到switch处,首先将括号变量或者表达式的值计算出来, 然后拿着这个值依次跟每个case后面所带的值进行匹配,一旦匹配成功,则执行 该case所带的代码,执行完成后,遇到break。跳出switch-case结构。 如果,跟每个case所带的值都不匹配。就看当前这个switch-case结构是否存在 default,如果有default,则执行default语句,如果没有default,则该switch-case结构 什么都不做。 4、循环结构 while循环: while(循环条件) { 循环体; } 执行过程:程序运行到while处,首先判断while所带的小括号内的循环条件是否成立, 如果成立的话,也就是返回一个true,则执行循环体,执行完一遍循环体后,再次回到 循环条件进行判断,如果依然成立,则继续执行循环体,如果不成立,则跳出while循环。 在while循环当,一般总会有那么一行代码,能够改变循环条件,使之终有一天不再成立, 如果没有那么一行代码能够改变循环条件,也就是循环条件永远都成立,我们称之这种循环 叫做死循环。 最简单的最常用的死循环: while(true) { } 特点:先判断,再执行,有可能一遍循环都不执行。 5、break 1)、可以跳出switch-case结构。 2)、可以跳出当前循环。 break一般不单独的使用,而是跟着if判断一起使用,表示,当满足某些条件的时候,就不再循环了。 6、do-while循环。 语法: do { 循环体; }while(循环条件); 执行过程:程序首先会执行do的循环体,执行完成后,去判断do-while循环的循环条件, 如果成立,则继续执行do的循环体,如果不成立,则跳出do-while循环。 特点:先循环,再判断,最少执行一遍循环体。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值