- 顺序结构
- 循环结构
- 选择结构
一、循环结构
- for-in
遍历区间、字符串、数组、字典 - for
for i in -100...100
{
i*i
}
//理论上这两个循环是同样的效果,但是在swift 3.0中,推荐使用for-in循环,因为i++已经被废弃,下面的写法会报两个错误:1、++ 和 --将要在Swift3中废弃;可以使用 += 1替代;2、C语言风格的声明将在Swift的未来版本废弃和移除。
for var i = -100 ; i <= 100 ; i ++
{
i*i
}
- while
- do-while
//二分查找法
var arr:[Int] = []
for i in 0..<100{
arr.append(Int(arc4random()%1000))
}
arr.sorted(by: <)//把数组从小到大进行排序
arr
var min_num = 0 , max_num = arr.count
var mid_num:Int
var target = Int(arc4random()%1000)
while min_num < max_num {
mid_num = ( min_num + max_num) / 2
arr[mid_num]
if arr[mid_num] == target {
print("\(target) is foud index \(mid_num)")
break
}
else if arr[mid_num] > target{
max_num = mid_num - 1
}
else{
min_num = mid_num + 1
}
}
if min_num >= max_num {
print("cannot find \(target) in arr")
}
二、选择结构
- if 语句
let imTrueVar = true
let imFalseVar = false
if imTrueVar {
print("I'm true!")
}
else if 3 + 4 == 7{
print("3+4==7!")
}
else{
print("I'm false!")
}
『注意』 一般的语言中都会将非零的值定义成真,但是Swift却非如此,例如:
var aa:Int = 1
//下面的写法编译器会报错,‘Int’这个整形是不能作为一个逻辑的值来进行这种选择的判断的(error: 'Int' is not convertible to 'Bool'),这也说明Swift是一个类型安全型语言,它要求开发者如果想做选择那就要明确的指明一个逻辑的值,即布尔值或者表达式
if aa{
print("I'm true!")
}
//正确的写法
if aa == 1{
print("I'm true!")
}
- switch 语句
- case值可以是Float、Bool、String、Int、元组等
- 不用显示的写break,在满足一个case的情况下,自动就会break,如果想连续执行,即满足一个case之后还会试图进行下一个case的判断,则使用关键字fallthrough
- case值和default必须包含所判断的变量的所有情况,只要case能涵盖所判断变量的所有情况,可以不需要使用default
- 不仅可以对整形变量具体的值进行判断,也可以对整形的范围进行判断
//switch语句,不需要显示的写break
var rating:Character = "A"
switch rating {
case "A","a":
print("Great!")
case "B":
print("Just so-so!")
default:
print("It's Bad.")
}
//switch 语句的一些高级用法
//不仅可以对整形变量具体的值进行判断,也可以对整形的范围进行判断
var score = 90
switch score {
case 0:
print("a")
case 1..<60:
print("b")
case 60:
print("c")
case 61..<70:
print("d")
case 70..<80:
print("e")
case 100:
print("f")
default:
print("g")
}
//可以对元组数据类型进行判断
var coordinate = (1,1)
switch coordinate {
case (0,0):
print("a")
case (-2...2,0):
print("b")
case (let x,0):
print("c")
case (-1,let y):
print("c")
case (_,1):
print("d")
case (0,_):
print("e")
case let (x,y) where x == y:
print("f")
case (_,let y) where y > 1 :
print("h")
default:
print("g")
}
//swift的switch语句不用显示的写braak,在满足一个case的情况下,自动就会break,如果想连续执行,即满足一个case之后还会试图进行下一个case的判断,则使用关键字fallthrough
coordinate = (0,0)
switch coordinate{
case (0,0):
print("原点")
fallthrough
case(_,0):
print("x 轴")
case(0,_):
print("y 轴")
case(-2...2,-2...2):
print("区间内")
default:
print("都不满足")
}
三、控制转移
- fallthrough
使得switch语句在做一个判断的时候,当变量的值落入了一个case后还有机会落入下一个case
「使用限制」需要使用fallthrough的case,其下一个case不能声明为变量
例如:
//这样是不被允许的
var coor = (1,1)
switch coor {
case (0,0):
print("a")
fallthrough
case (let x,0):
print("c")
case (-2...2,0):
print("b")
fallthrough
default:
print("d")
}
- break
- 立即跳出当前的循环体,即结束循环;
- 不仅仅可以使用于循环结构,也可以用于switch语句,在switch语句中break的用途是结束switch判断
- 在swift中的switch语句中不要求显示写break,但是需要涵盖所有的判断情况,且case后必须有执行语句,所以如果在某些case中什么操作也没有,这时候就可以使用break
- continue
跳过之后的操作,继续当前的循环体,即结束本次循环,进入下一次循环
break和continue都只是对当前的循环体起作用,但是swift语言提供了另外一种机制,可以使得break和continue这两个控制转移语句对任意一层循环体进行作用。
例如:
var board = Array< Array<Int> >()
for i in 0..<10
{
board.append( Array(repeating:0,count:10))
}
let randx = Int(arc4random()%10)
let randy = Int(arc4random()%10)
board[randx][randy] = 1
var ii = 0, jj = 0
mainloop:for i in 0 ..< 10
{
for j in 0 ..< 10
{
if board[i][j] == 1 {
break mainloop
}
jj += 1
}
ii += 1
}
print("board[\(ii)][\(jj)] = 1]")