使用if
和switch
进行条件判断,for-in
、for
、while
和do-while
进行循环。条件判断时的圆括号时可选的,但是if
或者循环体的花括号{}
时必须的。
let individualScores = [75, 43, 103, 87, 12]
var teamScore = 0
for score in individualScores {
if score > 50 {
teamScore += 3
} else {
teamScore += 1
}
}
teamScore
if
语句中,判断条件必须时布尔表达式,也就是说if score { ... }
的形式是错误的,它并不会隐式的与0进行比较。
你可以使用if
和let
一起来判断值是否缺失。这些值被看作是选项(Optionals)。一个选项包含一个值或者nil
来表示是否缺失内容。在类型后面添加?
标记一个值是一个选项。
var optionalString: String? = "Hello"
optionalString == nil
var optionalName: String? = "John Apppleseed"
var greeting = "Hello!"
if let name = optionalName {
greeting = "Hello, \(name)"
}
试验
将optionalName
的值改为nil
,看一下能不能得到问候。在if
后添加else
语句,使得optionalName
为nil
的时候打印不同的问候语句。
如果选项的值为nil
,条件为false
,if
后的语句被跳过。否则选项的值被赋值给let
后的常量,并且该常量的作用域为花括号里面。
Swift里的switch
语句支持任意数据类型以及比较操作,而不是被限制为整数的相等。
let vegetable = "red pepper"
switch vegetable {
case "celery":
let vegetableComment = "Add some raisins and make ants on a log."
case "cucumber", "watercress":
let vegetableComment = "That would make a good tea sandwich."
case let x where x.hasSuffix("pepper"):
let vegetableComment = "Is it a spicy \(x)?"
default:
let vegetableComment = "Everything tasts good in soup."
}
试验
尝试移除default
语句,看看有什么错
执行完switch
的一个case
后,程序会从switch
语句中跳出,而不会继续执行下一个case
语句,因此在Swift中不需要显式的使用break
跳出每一个分支。
在使用for-in
进行迭代的时候,每次迭代都会返回一个键值对:
let interestingNumbers = [
"Prime": [2, 3, 5, 7, 11, 13],
"Fibonacci": [1, 1, 2, 3, 5, 8],
"Square": [1, 4, 9, 16, 25],
]
var largest = 0
for (kind, numbers) in interestingNumbers {
for number in numbers {
if number > largest {
largetst = number
}
}
}
largest
试验
增加一个变量,记录最大值所在的分类
while
会一直循环执行,直到判断条件发生变化。如果使用do-while
,循环体至少会执行一次。
var n = 2
while n < 100 {
n = n * 2
}
n
var m = 2
do {
m = m * 2
} while m < 100
m
在for
循环中通过索引来控制循环,其中..
用来创建一个索引的范围,下面两个循环是一样的效果
var firstForLoop = 0
for i in 0..3 {
firstForLoop += i
}
firstForLoop
var secondForLoop = 0
for var i = 0; i < 3; ++i {
secondForLoop += 1
}
secondForLoop
使用..
(两点)创建的范围不包括最大值,而...
(三点)创建的范围包含最大值。