上述代码中,如果可选值为nil,那么判断条件则为false,而且在{}中的代码将会被忽略,如果可选值不为nil,会将该值逐步运算后赋值给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."
}
EXPERIMENT //练习题
Try removing the default case. What error do you get? // 尝试删除default 语句,看看或得到什么错误提示?
Switch语法在执行完成匹配的代码之后会直接退出,不会再继续执行后面的case语句,因此不必在每个case语句后面明显的添加break来跳出switch.
在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 {
largest = number
}
}
}
largest
EXPERIMENT // 练习题
Add another variable to keep track of which kind of number was the largest, as well as what that largest number was. // 试着添加另一个变量来追踪largest的类型,同时也看看largest的值是多少.
在Swift中,使用while可以根据条件来执行一段代码体,直到条件出现某种变化.循环的条件可以放在最后,这样可以确保循环至少被执行一次.
var n = 2
while n < 100 {
n = n * 2
}
n
var m = 2
do {
m = m * 2
} while m < 100
m
在循环中,可以使用..来指定一个索引的范围(用在初始化,条件和增量)下面代码的两个循环是同样的效果:
var firstForLoop = 0
for i in 0..3 {
firstForLoop += i
}
firstForLoop
var secondForLoop = 0
for var i = 0; i < 3; ++i {
secondForLoop += 1
}
secondForLoop
使用..确定范围,会忽略上一个值(就是范围的初始值),如果使用...确定范围,就要包含两个值(初始值和终止值).
Functions and Closures
/*函数以及组合体*/
在Swift中,使用func 来声明一个函数;调用函数时,只需在函数名字后面跟上(),在()内添加参数列表.使用箭头(->)来分隔参数名称和函数的返回值类型.
func greet(name: String, day: String) -> String { //定义函数greet,参数为字符串型的name和day,返回值为字符串
return "Hello \(name), today is \(day)."
}
greet("Bob", "Tuesday") //调用greet函数
EXPERIMENT // 练习题
Remove the day parameter. Add a parameter to include today’s lunch special in the greeting. // 删掉day这个参数,添加一个参数(包含today’s lunch)到greet函数中指定的位置
通过组合可以从一个函数返回多个值:
func getGasPrices() -> (Double, Double, Double) {
return (3.59, 3.69, 3.79)
}
getGasPrices()
函数也可以通过数组的形式来接收多个参数:
func sumOf(numbers: Int...) -> Int { /**定义函数sumof(),参数为numbers数组*/
var sum = 0 /**定义变量sum 并赋值为0*/
for number in numbers { /**for循环,遍历numbers数组*/
sum += number /**求和*/
}
return sum /**返回sum*/
}
sumOf() /**调用函数sumof(),不传递参数*/
sumOf(42, 597, 12) /**调用函数sumof(),传递三个参数*/
EXPERIMENT // 练习题
Write a function that calculates the average of its arguments. // 编写一个函数,计算它参数的平均值
函数可以嵌套,嵌套在内层的函数,可以访问它外层函数声明的变量;在一个复杂或者冗长的函数中,可以使用嵌套的函数来组织架构.
func returnFifteen() -> Int { /**定义函数returnFifteen()*/
var y = 10 /**定义变量y,赋值10*/
func add() { /**定义函数add()*/
y += 5
}
add() /**调用函数add()*/
return y /**返回y值*/
}
returnFifteen() /**调用函数returnFifteen()*/
在Swift中,函数是一种基本数据类型,这就意味着,一个函数,可以将另一个函数作为它的返回值.
func makeIncrementer() -> (Int -> Int) { /**定义函数makeIncrementer,参数空,返回值为(int->int)*/
func addOne(number: Int) -> Int { /**定义函数addOne(),参数为number,返回值类型为int*/
return 1 + number
}
return addOne /**将函数addOne作为返回值,返回*/
}
var increment = makeIncrementer()
increment(7)
在Swift中,一个函数也可以接收另一个函数来当做它的参数.
func hasAnyMatches(list: Int[], condition: Int -> Bool) -> Bool {
for item in list {
if condition(item) {
return true
}
}
return false
}
func lessThanTen(number: Int) -> Bool {
return number < 10
}
var numbers = [20, 19, 7, 12]
hasAnyMatches(numbers, lessThanTen)
/**********后续有更新,敬请关注*********/
Welcome to Swift (苹果官方Swift文档初译与注解三)---11~18页,布布扣,bubuko.com