Swift(二)

import Foundation

//  函数和闭包

//  函数的定义

/*

func 函数名(参数列表) -> 返回值类型{

    函数实现

}

*/

func sayHello(name: String) -> String{

    return "Hello " + name

}

扫描二维码关注公众号,回复: 3800696 查看本文章

println(sayHello("北京"))


//  定义一个函数类型 (接收函数参数是string 返回值也是string类型的)变量可以改值

var funcType: (String -> String) = sayHello

println(funcType("海淀"))


func sayGoodBye(name: String) -> String{

    return "GoodBye " + name

}

funcType = sayGoodBye

println(funcType("清河"))


//  函数的多返回值(元组)

func count(stringA: String) -> (vowels: Int, consonants: Int){

    var vowels = 0

    var consonants = 0 // 如果一行有两个语句用;进行分割

    for character in stringA{

        var string: String = String(character).lowercaseString // 转化为小写字符

        switch string {

            case "a", "e", "i", "o", "u":

            vowels++

            case "b", "c", "d", "f", "g", "h":

            consonants++

        default:

            println("非字符")

        }

    }

    return (vowels, consonants)

}


var letterCount = count("aeifgh23")

println("元组个数:\(letterCount.0), 辅音个数:\(letterCount.1)")


//  参数没有名字, 外部参数名称, 让开发者知道参数用来做什么

//  声明了外部参数名称, 代用的是时候必须写

//  # 使内部参数名称变为内外都可以使用

func personInfo(person name: String, #sex: String) -> String{

    return name + " " + sex

}

println(personInfo(person: "辉哥", sex: ""))

//  可以指定参数的默认值, 直接在参数列表最后增加

func personInfoDetail(#name: String, #sex: String, company: String = "蓝欧 ",age: String = "18") -> String{

    return name + sex + company + age

}

println(personInfoDetail(name: "辉哥 ",sex: " "))

println(personInfoDetail(name: "亚姐 ",sex: " ", company: "Apple ",age: "20")) // 默认参数系统自动的设置为外部参数, 如果不想写的话, _ 忽略 符号之间注意空格啊 空格敏感啊


//  可变参数(参数的个数可变, 使用...

func meanValue(numbers: Double...) -> Double{

    var sum = 0.0

    for number in numbers{

        sum += number

    }

    return sum / Double(numbers.count) // 求平均数

}

println("meanValue = \(meanValue(1.0, 2.0, 3.0, 4.0))")

//  在参数列表中可以声明var 在函数内部可以改变参数的值,不影响外部

func inArgument(var a: Int,b: Int){

    a++

    //b++

}

var number = 5

inArgument(number, 3)

println("number = \(number)")


//  如果想改变传递参数的值并且作用于函数外部(C语言传地址)在Swift中使用关键字 inout 传递参数的时候需要使用取地址符 &

func swapTwoInt(inout a: Int,inout b:Int){

    var temp = a

    a = b

    b = temp

}

var valueA = 3,valueB = 5

swapTwoInt(&valueA, &valueB)

println("valueA = \(valueA),valueB = \(valueB)")


//  函数嵌套(默认是共有的 被嵌套的函数在函数外部不能访问)

func plusOne(number: Int) -> Int{

    return number + 1

}

func tallyDown(number: Int) -> Int{

    return number - 1

}

func changeValue(isPlusOne: Bool) -> (Int -> Int){

    return isPlusOne ? plusOne : tallyDown // 返回函数类型相同

}

var changeValuePlusOne: Int -> Int = changeValue(true)

var changeValueTallyDown: Int -> Int = changeValue(false)


var value = 90

println("加一:\(changeValuePlusOne(value))")

println("减一:\(changeValueTallyDown(value))")


//  闭包

//  闭包和OC里面的blocks类似, 一段封闭的代码块, 匿名函数

/*

{

    (参数列表) -> (返回值类型) in

    闭包的实现

}

*/


var names = ["zhangsan", "lisi", "wangwu", "maliu"]

//  完整版

var sortedName1 = sort(names, {

    (stringA: String, stringB: String) -> Bool in

    return stringA > stringB

    })

println("sortedName1: \(sortedName1)")

//  去掉类型推断

var sortName2 = sort(names, {

    (stringA, stringB) -> Bool in

    stringA > stringB //  如果闭包里只有一个语句 并且是返回值 可以去掉return


    })

println("sortName2: \(sortName2)")


//  继续简化  去掉in之前的

var sortName3 = sort(names, {

    $0 > $1

    })

println("sortName3: \(sortName3)")


//  最减式

var sortName4 = sort(names, >) // 运算符重载

println("sortName4: \(sortName4)")


//  尾随闭包,如果函数的最后一个参数是一个闭包,那么闭包可以直接写在函数的外面

var sortName5 = sort(names){

    $0 > $1

}

/*

//  Xcode6之后, sort函数进行了更改

var sortedName1: () = sort(&names, {

    

    })


*/



猜你喜欢

转载自blog.csdn.net/a_ss_a/article/details/38513315
今日推荐