Apple Swift学习教程(2)

使用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 

    } 

teamScore 

 

在if语句中,条件必须是一个布尔表达式——像if score { ... }这样的代码是错误的。

 

你可以一起使用if和let来处理值缺失的情况。有些变量的值是可选的。一个可选的值可能是一个具体的值或者是nil,表示值缺失。在类型后面加一个问号来标记这个变量的值是可选的。

var optionalString: String? = "Hello" 

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,大括号中的代码会被跳过。如果不是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." 

 

练习删除default语句,看看会有什么错误?

 

运行switch中匹配到的子句之后,程序会退出switch语句,并不会继续向下运行,所以不需要在每个子句结尾写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 { 

            largest = number 

        } 

    } 

largest 

 

练习:添加另一个变量来记录哪种类型的数字是最大的。

 

使用while来重复运行一段代码直到不满足条件。循环条件可以在开头也可以在结尾。

var n = 2 

while n < 100 { 

    n = n * 2 

 

var m = 2 

do { 

    m = m * 2 

while m < 100 

 

你可以在循环中使用..来表示范围,也可以使用传统的写法,两者是等价的:

var firstForLoop = 0 

for i in 0..3 { 

    firstForLoop += i 

firstForLoop 

 

var secondForLoop = 0 

for var i = 0; i < 3; ++i { 

    secondForLoop += 1 

secondForLoop 

 

使用..创建的范围不包含上界,如果想包含的话需要使用...。

 

函数和闭包

使用func来声明一个函数,使用名字和参数来调用函数。使用->来指定函数返回值。 

func greet(name: String, day: String) -> String { 

    return "Hello \(name), today is \(day)." 

greet("Bob""Tuesday"

 

练习:删除day参数,添加一个参数来表示今天吃了什么午饭。

 

使用一个元组来返回多个值。 

func getGasPrices() -> (Double, Double, Double) { 

    return (3.59, 3.69, 3.79) 

getGasPrices() 

 

函数的参数数量是可变的,用一个数组来获取它们:

func sumOf(numbers: Int...) -> Int { 

    var sum = 0 

    for number in numbers { 

        sum += number 

    } 

    return sum 

sumOf() 

sumOf(42, 597, 12) 

 

练习:写一个计算参数平均值的函数。

 

函数可以嵌套。被嵌套的函数可以访问外侧函数的变量,你可以使用嵌套函数来重构一个太长或者太复杂的函数。

func returnFifteen() -> Int { 

    var y = 10 

        func add() { 

        y += 5 

    } 

    add() 

    return y 

returnFifteen() 

 

函数是一等公民,这意味着函数可以作为另一个函数的返回值。

func makeIncrementer() -> (Int -> Int) { 

    func addOne(number: Int) -> Int { 

        return 1 + number 

    } 

    return addOne 

var increment = makeIncrementer() 

increment(7) 

 

函数也可以当做参数传入另一个函数。

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) 

 

函数实际上是一种特殊的闭包,你可以使用{}来创建一个匿名闭包。使用in来分割参数并返回类型。

numbers.map({ 

    (number: Int) -> Int in 

    let result = 3 * number 

    return result 

    }) 

 

练习:重写闭包,对所有奇数返回0。

 

有很多种创建闭包的方法。如果一个闭包的类型已知,比如作为一个回调函数,你可以忽略参数的类型和返回值。单个语句闭包会把它语句的值当做结果返回。

 

你可以获取参数的数量——这个方法在非常短的闭包中很有用。一个被作为最后一个参数传入函数的时候可以直接出现在括号后面。

sort([1, 5, 3, 12, 2]) { $0 > $1 } 

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/8069ddb7e13d04e4b7d4dab93f9f1dd5.html