2.流程控制

if-else 的特殊用法

  1. if后面的条件可以省略小括号
  2. 条件后面的大括号不可以省略
bash 复制代码
let age = 4
if age >= 22 {
   print("可以结婚了")
}

3.if后面的条件只能是Bool类型的

复制代码
if age {
}

上面的语句会报错,也就是只能显式的转化是一个Bool类型

while 语句

dart 复制代码
var num = 5
while num >0 {
print("num is \(num)")
num -=1
}
dart 复制代码
var num = -1
repeat {
print("num" is \(num))
} while num >0 //打印了一次
  • repeat-while 相当于C语言中的do-while
  • 这里不用num--,是因为从swift3开始,去除掉了自增(++),自减(--)运算符

for

闭区间运算符:a...b, a<= 取值 <= b,也就是说 ... 和 <= 都可以表示闭区间

  1. 普通的写法
scss 复制代码
let names = ['Anna','Alex','Brain','Jack']
for i in 0...3 {
  print(names[i])
}
//Anna Alex Brian Jack

2.将区间写成一个变量

go 复制代码
let range = 1...3
for i in range {
print(names[i])
}
// Alex Brian Jack

3.区间可以一部分用变量,一部分不用变量

css 复制代码
let a = 1
var b = 2
for i in a..b {
print(names[i])
}
// Alex Brian
css 复制代码
for i in a...3 {
print(names[i])
}

4.上面的循环的下标i默认是用let声明的,有需要时可以声明为var

css 复制代码
for var i in 1...3 {
i += 5
print(i)
}// 6 7 8

5.如果下面的代码用不到循环下标i,可以用 _去省略

go 复制代码
for _ in 1...3 {
print("for")
} // 打印3次

半开区间运算符:a..<b, a<= 取值 < b,也就是用 ..., <= 和 < 构成半开区间

scss 复制代码
for i in 1...<5 {
print(i)
}
// 1 2 3 4

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

go 复制代码
let range = ...5
range.contains(7) // false
range.contains(4) // true
range.contains(-3)// true

区间运算符在数组上的运用

scss 复制代码
let names = ['Anna',"Alex","Brian","jack"]
for name in names[0...3] {
print(name)
}
scss 复制代码
for name in names[2...]{
 print(name)
} // Brain Jack
scss 复制代码
for name in names[...2]{
 print(name)
}// Anna Alex Brian
scss 复制代码
for name in names[..<2] {
 print(name)
} //Anna Alex

区间类型

swift 复制代码
let range1: ClosedRange<Int> = 1...3
let range2: Range<Int> = 1..<3
let range3: PartialRangeThrough<Int> = 。。。5

需要特别注意的是上面的PartialRangeThrough 不能循环

闭区间 复制代码
let range:ClosedRange<Int> = 3...5

for _ in range{
print("我打印了开区间")
}
半开区间 复制代码
let range2: Range<Int> = 1..<3

for _ in range2 {

    print("我是打印半开区间")

}
开区间不能循环 复制代码
let range3:PartialRangeThrough = ...5
for _ in range3 {
}

上面的开区间循环报错

arduino 复制代码
For-in loop requires 'PartialRangeThrough<Int>' to conform to 'Sequence'

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

bash 复制代码
let stringRange1 = "cc"..."ff"
stringRange1.contains("cb")
stringRange1.contains("dz")
stringRange1.contains("fg")

let stringRange2 = "a"..."f"
stringRange2.contains("d")
stringRange2.contains("h")
swift 复制代码
// \0 到 ~ 包括了所有可能要用到的ASCII字符
let characterRange: ClosedRange<Character> = "\0"..."~"
characterRange.contains("G")

带间隔的区的区间值

csharp 复制代码
let hours = 11
let hourInterval = 2
// tickMark的取值:从4开始,累加2,不超过11
for tickMark in stride(from: 4, to: hours, by: hourInterval){
    print(tickMark)
}

switch 语句

dart 复制代码
var num = 1
// case, default 后面不能写大括号
switch num {
case 1:
    print("number is 1")
    // 默认可以不写break,并不会贯穿到后面的条件
    break
case 2:
    print("number is 2")
    break
case 3:
    print("number is 3")
    break
default:{
    print("number is other")
}()
    break
}

贯穿问题

下面case 1 是不会贯穿到下面的

dart 复制代码
var num = 1
// case, default 后面不能写大括号
switch num {
case 1:
    print("number is 1")
    // 默认可以不写break,并不会贯穿到后面的条件
case 2:
    print("number is 2")
case 3:
    print("number is 3")
default:
    print("number is other")
    break
}

如果需要贯穿使用fallthrough,这个的贯穿的意思就是不判断接下来的一个条件,而且只会判断接下来的一个条件,后面还是会判断条件的。

dart 复制代码
var num = 1
// case, default 后面不能写大括号
switch num {
case 1:
    print("number is 1")
    fallthrough
    // 默认可以不写break,并不会贯穿到后面的条件
case 2:
    print("number is 2")
case 3:
    print("number is 3")
default:
    print("number is other")
    break
}

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

case default 后面至少要有一个语句,如果不想做任何事,加break即可

如果能保证已处理所有情况,也可以不必使用deault

swift 复制代码
// 定义枚举的一种方式
enum Answer {case right, wrong}
let answer = Answer.right

switch answer {
case Answer.right:
    print("right")
case Answer.wrong:
    print("wrong")
}

// 下面是一种简化的方式
//switch answer {
//case .right:
//    print("right")
//case .wrong:
//    print("left")
//}

switch 也支持Character,String 类型

String类型

单一值

go 复制代码
let string = "Jack"
switch string {
case "Jack":
    fallthrough
case "rose":
    print("Right person")
default:
    break
}

多个值

go 复制代码
switch string {
case "Jack","Rose":
    print("Right Person")
default:
    break
}

Character类型

swift 复制代码
let character: Character = "a"
switch character {
case "a","A":
    print("the letter A")
default:
    print("Not the letter A")
}

匹配区间,元祖匹配

区间匹配

swift 复制代码
let count = 62
switch count {
case 0:
    print("none")
case 1..<5:
    print("a few")
case 5..<12:
    print("several")
case 12..<100:
    print("dozens of")
case 100..<1000:
    print("hundres of")
default:
    print("many")
}

元祖匹配

swift 复制代码
let point = (1,1)
switch point {
case(0,0):
    print("the origin")
case(_,0):
    print("on the x-axis")
case(0,_):
    print("on the y-axis")
case(-2...2,-2...2):
    print("inside the box")
default:print("outside of the box")
}
  • 可以使用下划线_忽略某个值
  • 关于case匹配的问题,属于模式匹配的范畴,以后会再次详细展开详解

值绑定

值绑定其实就是将case传过来的值绑定在一个变量上,这个变量可以用 let var,变量就可以在后面使用

swift 复制代码
// 值绑定
let point1 = (2,0)
switch point1 {
case (let x, 0):
    print("on the x-axis with an x value of \(x)")
case (0, let y):
    print("on the y-axis with a y value of \(y)")
case let (x,y):
    print("somewhere else at (\(x),\(y))")
}

和 where 结合起来使用,where 那里的,其实就是加限制条件,限制本次循环是否进入循环体,而不是整个循环是否结束。相当于continus

swift 复制代码
// 和 where配合使用
let point3 = (1,-1)
switch point3 {
case let (x,y) where x == y:
    print("on the line x==y")
case let (x,y) where x == -y:
    print("on the line x==-y")
case let (x,y):
    print("在别的线上")
}
bash 复制代码
var numbers = [10,20,-10,-20,30,-30]
var sum = 0
for num in numbers where num > 0 {
    sum = sum + num
}
print(sum)

标签语句

加标签是为了跳出外层循环 outer: for i in 1...4 { for k in 1...4 { if k == 3 { continue outer } if i == 3 { break outer } print("i==(i),k ==(k)") } }

相关推荐
90后的晨仔27 分钟前
iOS 蓝牙开发基础知识梳理
ios
一牛1 小时前
Metal 进阶:读取可绘制对象的像素
ios·swift·计算机图形学
90后的晨仔1 小时前
什么是WebSocket ?ios 中如何使用?
ios
鸿蒙布道师4 小时前
鸿蒙NEXT开发日期工具类(ArkTs)
android·ios·华为·harmonyos·arkts·鸿蒙系统·huawei
无知的前端4 小时前
iOS开发,runtime实现切片编程原理以及实战用例
ios·面试·性能优化
木西6 小时前
React Native项目初始化及相关通用工具集成
android·react native·ios
胡八一16 小时前
Window调试 ios 的 Safari 浏览器
前端·ios·safari
karshey20 小时前
【IOS webview】源代码映射错误,页面卡住不动
ios
鸿蒙布道师21 小时前
鸿蒙NEXT开发土司工具类(ArkTs)
android·ios·华为·harmonyos·arkts·鸿蒙系统·huawei