if-else 的特殊用法
- if后面的条件可以省略小括号
- 条件后面的大括号不可以省略
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,也就是说 ... 和 <= 都可以表示闭区间
- 普通的写法
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)") } }