要处理条件逻辑,使用 if 和 switch ,要处理循环逻辑,使用 for-in,for,while,和 do-while 。包着条件或者循环的括号可加可不加。处理逻辑体的花括弧是必须加的。
let individualscores = [75,43,103,87,12]
var teamscore = 0
for score in individualscores {
if score > 50 {
teamscore += 3
} else {
teamscore += 1
}
}
println(teamscore)
注意
在if语句里,条件必须是一个Boolean表达式——意思是像 if score { … } 这种写法是错的,因为不能隐式地转换为0值。
你可以把 if 和 let 一起使用来处理可能不明确的值。这些值表示为可选值。可选值要么包含一个值,要么包含 nil ,表明这个值是不明确的。在值的类型后加上问号 (?) 来标记这个值是可选的。
var optionalString: String? = "Hello"
println(optionalString == nil)
var optionalName: String? = "John Appleseed"
var greeting = "Hello!"
if let name = optionalName {
greeting = "Hello,\(name)"
}
试一试
将 optionalName 改为 nil。 greeting 是什么值? 再加一个 else
语句,如果 optionalName 是 nil ,将 greeting 设置一个不同的值。
如果可选值是 nil ,条件就为false,花括弧里的代码就会被跳过。否则,可选值被开启(unwrapped,博主注:这里的unwrapped实在不知道该如何翻译更好,这个词的原意为打开、展开,直接翻译过来感觉怪怪的,暂时称之为开启吧,貌似有的文章翻译为解析)并赋给 let 后面的常量,这个常量就可以使的开启值用在代码块里了。
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 tastes good in soup."
}
试一试
试试把default那一部分去掉。看看会有什么错误?
注意看一下 let 是怎么用来将匹配模式部分的值赋给常量的。
匹配switch case 的代码执行完以后,程序从switch语句跳出。不会执行下一个case,所以没有必要在每个case结束部分代码处显示的跳出switch。
通过提供一组用于各个键值对的名称,用 for-in 来遍历字典。字典是无序集合,所以它们的键和值通过字母表顺序来进行遍历。
let interestingNumbers = [
"Prime": [2,3,5,7,11,13],"Fibonacci": [1,1,2,8],"Square": [1,4,9,16,25],]
var largest = 0
for (kind,numbers) in interestingNumbers {
for number in numbers {
if number > largest {
largest = number
}
}
}
println(largest)
试一试
增加一个变量来追踪哪种数是最大的,还有这个最大的数是多少
用 while 来重复执行一段代码直到条件改变。循环的条件也可以放到最后,以保证循环至少执行一次。
var n = 2
while n < 100 {
n = n * 2
}
println(n)
var m = 2
do {
m = m * 2
} while m < 100
println(m)
你可以在循环里维持一个索引——要么使用 ..< 创建一套索引或者要么写一个显示的初始化、条件和递进。这两种循环是一样的:
var firstForLoop = 0
for i in 0..<4 { firstForLoop += i }
println(firstForLoop)
var secondForLoop = 0
for var i = 0; i < 4; ++i { secondForLoop += i }
println(secondForLoop)
用 ..< 创建的索引忽略最大值,用 … 创建的索引包含最大值。