经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » iOS » 查看文章
Swift系列二 - 循环控制
来源:cnblogs  作者:1024星球  时间:2021/5/7 11:49:40  对本文有异议

一、if-else

  • if后面的条件可以省略小括号
  • 条件后面的大括号不可以省略
  1. let age = 10
  2. if age >= 18 {
  3. print("大学")
  4. } else if age >= 16 {
  5. print("高中")
  6. } else {
  7. print("义务")
  8. }
  • if后面的条件只能是Bool类型

二、while

  1. var num = 3
  2. while num > 0 {
  3. print("num is \(num)")
  4. num -= 1
  5. }
  6. /*
  7. 输出:
  8. num is 3
  9. num is 2
  10. num is 1
  11. */
  • swift中没有do-while,相同逻辑的是repeat-while
  • swift3开始,去除了自增(++),自减(--)运算符
    • 不要再使用num++num--++num--num等运算符了
    • 自增自减运算符在不同平台有不一样的效果,所以swift放弃了使用
  1. var num = -1
  2. repeat {
  3. print("num is \(num)")
  4. } while num > 0
  5. /*
  6. 输出:num is -1
  7. */

三、for

3.1. 区间运算符

格式:a...b(a <= 取值 <= b)

  • 变量默认是let修饰,可以自己根据情况修改为var
  1. // 常规用法
  2. let words = ["aaa", "bbb", "ccc", "ddd"]
  3. for i in words {
  4. print(i);
  5. }
  6. /*
  7. 输出:
  8. aaa
  9. bbb
  10. ccc
  11. ddd
  12. */
  13. // 区间用法
  14. for i in 1...3 {
  15. print(i, words[i])
  16. }
  17. /*
  18. 输出:
  19. 1 bbb
  20. 2 ccc
  21. 3 ddd
  22. */
  23. // var修饰
  24. for var i in 1...3 {
  25. i += 5
  26. print(i)
  27. }
  28. /*
  29. 输出:
  30. 6
  31. 7
  32. 8
  33. */
  34. // 区间定义常量
  35. let range = 1...3
  36. for i in range {
  37. print(i)
  38. }
  39. /*
  40. 输出:
  41. 1
  42. 2
  43. 3
  44. */
  45. // 区间值自定义
  46. let a = 1
  47. let b = 3
  48. for i in a...b {
  49. print(i)
  50. }
  51. /*
  52. 输出:
  53. 1
  54. 2
  55. 3
  56. */

3.2. 半开区间运算符

格式:a..<b(a <= 取值 < b)

  1. for i in 1..<3 {
  2. print(i)
  3. }
  4. /*
  5. 输出:
  6. 1
  7. 2
  8. */

3.3. 区间运算符用在数组上

  1. // 此处只是示例用法,实际应用时应注意数组越界
  2. let words = ["aaa", "bbb", "ccc", "ddd"]
  3. for i in words[0...3] {
  4. print(i);
  5. }

3.4 单侧区间:让区间朝一个方向尽可能的远

  1. // 常规闭区间
  2. let words = ["aaa", "bbb", "ccc", "ddd"]
  3. for word in words[0...3] {
  4. // print(word);
  5. }
  6. /*
  7. 输出:
  8. aaa
  9. bbb
  10. ccc
  11. ddd
  12. */
  13. // 左边代表开始,右边代表数组最大长度
  14. for word in words[2...] {
  15. print(word)
  16. }
  17. /*
  18. 输出:
  19. ccc
  20. ddd
  21. */
  22. // 左边代表0,右边闭区间值
  23. for word in words[...2] {
  24. print(word)
  25. }
  26. /*
  27. 输出:
  28. aaa
  29. bbb
  30. ccc
  31. */
  32. // 左边代表0,右边<2
  33. for word in words[..<2] {
  34. print(word)
  35. }
  36. /*
  37. 输出:
  38. aaa
  39. bbb
  40. */
  41. // 无限制,range左边是无穷小的整数
  42. let range = ...5
  43. print(range.contains(7)) // false
  44. print(range.contains(1)) // true
  45. print(range.contains(-2)) // true

四、区间类型(Range)

  • 范围代表的是两个值的区间,它由上下边界进行定义;
  • 不能对 Range 或者 ClosedRange 进行迭代,但是我们可以检查某个元素是否存在于范围中;
  • Range 和 ClosedRange 既非序列,也不是集合类型。有一部分范围确实是序列是因为 0..<10 的类型其实是一个 CountableRang。CountableRange 和 Range 很相似,只不过它还需要一个附加约束:它的元素类型需要遵守 Strideable 协议 (以整数为步?)。Swift 将这类功能更强的范围叫做可数范围,这是因为只有这 类范围可以被迭代。可数范围的边界可以是整数或者指针类型,但不能是浮点数类型,这是由 于 Stride 类型中有一个整数的约束。如果你想要对连续的浮点数值进行迭代的话,你可以通过 使用 stride(from:to:by) 和 stride(from:through:by) 方法来创建序列用以迭代。
-- 半开 闭合
Comparable Range ClosedRange
Strideable(以整数为步长) CountableRange CountableClosedRange

4.1. 同时省略掉上、下两个边界,这样你将会得到整个集合类型的切片

  1. let arr = [1,2,3,4]
  2. arr[...] // [1, 2, 3, 4]
  3. type(of: arr) // Array<Int>
  1. // 半开区间
  2. let rang: Range = 0.0..<1.0
  3. let countableRange: CountableRange = 0..<1
  4. // 闭区间
  5. let closedRange: ClosedRange = 0.0...1.0
  6. let countableClosedRange: CountableClosedRange = 0...1
  7. // 右侧闭区间
  8. let partialRangeThrough: PartialRangeThrough = ...1.0
  9. // 左侧闭区间
  10. let partialRangeFrom: PartialRangeFrom = 0.0...
  11. // 右侧开区间
  12. let partialRangeUpTo: PartialRangeUpTo = ..<1.0
  13. // 左侧闭区间
  14. let countablePartialRangeFrom: CountablePartialRangeFrom = 1...

4.2. 字符、字符串也能使用区间运算符,但默认不能用在for-in中

  1. let stringRange1 = "cc"..."ff"
  2. stringRange1.contains("cb") // false
  3. stringRange1.contains("dz") // true
  4. stringRange1.contains("e") // true
  5. stringRange1.contains("fg") // false
  6. let stringRange2 = "a"..."f"
  7. stringRange2.contains("a") // true
  8. stringRange2.contains("e") // true
  9. stringRange2.contains("g") // false
  10. // \0到~囊括了所有可能要用到的ASCII字符
  11. let characterRange: ClosedRange<Character> = "\0"..."~"
  12. characterRange.contains("G") // true

4.3 带间隔的区间值

  1. let startValue = 0
  2. let endValue = 10
  3. let interval = 2
  4. // value取值从startValue开始,每次间隔interval,不超过endValue
  5. for value in stride(from: startValue, through: endValue, by: interval) {
  6. print(value)
  7. }
  8. /*
  9. 输出:
  10. 0
  11. 2
  12. 4
  13. 6
  14. 8
  15. 10
  16. */
  17. // 另外一个方法 to是开区间
  18. public func stride<T>(from start: T, to end: T, by stride: T.Stride) -> StrideTo<T> where T : Strideable

五、switch

5.1. case、default后面不能写大括号(编译器会报错)

5.2. 默认情况下可以不写break,并不会贯穿到后面的条件

  1. enum HeaderCode {case success, failure, redirect, connect}
  2. let code = HeaderCode.success
  3. switch code {
  4. case .success:
  5. print("success")
  6. case .redirect:
  7. print("redirect")
  8. case .connect:
  9. print("connect")
  10. default:
  11. print("failure")
  12. }
  13. /*
  14. 输出:success
  15. */

5.3. 如果需要贯穿,怎么办?fallthrough

  1. enum HeaderCode {case success, failure, redirect, connect}
  2. let code = HeaderCode.success
  3. switch code {
  4. case .success:
  5. print("success")
  6. fallthrough
  7. case .redirect:
  8. print("redirect")
  9. case .connect:
  10. print("connect")
  11. default:
  12. print("failure")
  13. }
  14. /*
  15. 输出:
  16. success
  17. redirect
  18. */

5.4. case、default后面至少要有一条语句

5.5. switch必须要保证能处理所有情况

  • 如果不想做任何事,加个break即可
  • 如果能保证已处理所有情况,也可以不使用default
  1. enum HeaderCode {case success, failure, redirect, connect}
  2. let code = HeaderCode.success
  3. switch code {
  4. case .success:
  5. break
  6. case .redirect:
  7. print("redirect")
  8. case .connect:
  9. print("connect")
  10. case .failure:
  11. print("failure")
  12. }

5.6. 复合条件(switch支持Character、String类型)

  1. // String
  2. let string = "idbeny"
  3. switch string {
  4. case "idbeny":
  5. print("idbeny")
  6. fallthrough
  7. case "developer":
  8. print("developer")
  9. default:
  10. print("man")
  11. }
  12. /*
  13. 输出:
  14. idbeny
  15. developer
  16. */
  17. // Character
  18. let character: Character = "a"
  19. switch character {
  20. case "a", "A":
  21. print("aaa")
  22. default:
  23. print("not found")
  24. }
  25. /*
  26. 输出:aaa
  27. */

5.7. 区间匹配、元组匹配

  1. // 区间匹配
  2. let count = 10
  3. switch count {
  4. case 0:
  5. print("zero")
  6. case 1...5:
  7. print("few")
  8. case 10...100:
  9. print("large")
  10. default:
  11. print("not found")
  12. }
  13. /*
  14. 输出:large
  15. */
  16. // 元组匹配
  17. let point = (1, 1)
  18. switch point {
  19. case (0, 0):
  20. print("origin")
  21. case (_, 0):
  22. print("x-axis")
  23. case (0, _):
  24. print("y-axis")
  25. case (-2...2, -2...2):
  26. print("in the box")
  27. default:
  28. print("not found")
  29. }
  30. /*
  31. 输出:in the box
  32. */
  • 可以用下划线(_)忽略某个值
  • 值绑定(必要时let可以改为var)
  1. let point1 = (2, 0)
  2. switch point1 {
  3. case (let x, 0):
  4. print("on the x-axis and x value of \(x)")
  5. case (0, let y):
  6. print("on the y-axis and y value of \(y)")
  7. case (let x, let y):
  8. print("at (\(x), \(y))")
  9. }
  10. /*
  11. 输出:on the x-axis and x value of 2
  12. */

六、where(过滤)

  1. let point = (1, -1)
  2. switch point {
  3. case let(x, y) where x == y:
  4. print("x == y")
  5. case let(x, y) where x == -y:
  6. print("x == -y")
  7. case let(x, y):
  8. print("at (\(x), \(y))")
  9. }
  10. /*
  11. 输出:x == -y
  12. */
  13. // 把所有数加起来
  14. var numbers = [10, 20, -30, -40, 50]
  15. var sum = 0
  16. for num in numbers where num > 0 {
  17. sum += num
  18. }
  19. print(sum)
  20. /*
  21. 输出:80
  22. */

七、标签语句

  1. side: for i in 1...4 {
  2. for k in 1...4 {
  3. if k == 3 {
  4. continue side
  5. }
  6. if i == 3 {
  7. break side
  8. }
  9. print("i == \(i), k == \(k)")
  10. }
  11. }
  12. /*
  13. 输出:
  14. i == 1, k == 1
  15. i == 1, k == 2
  16. i == 2, k == 1
  17. i == 2, k == 2
  18. */

原文链接:http://www.cnblogs.com/idbeny/p/swift-syntax-loop.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号