美文网首页Swift开发做一个Swifter
Swift 2.0 学习笔记 6_函数

Swift 2.0 学习笔记 6_函数

作者: Guibs | 来源:发表于2015-10-01 00:04 被阅读67次

    //: 函数

    //: 函数的定义和调用

    // 当你定义一个函数时, 你可以定义一个或多个有名字和类型的值作为函数的输入(参数, parameters), 也可以定义某种类型的值作为函数执行结束的输出(返回类型, return type)

    // 一个函数的实参必须与函数参数列表里参数的顺序一致

    func sayHello1(personName: String) -> String {

    let say = "你好, \(personName)"

    return say

    }

    func sayHello2(personName: String) -> String {

    return "你好, \(personName)"

    }

    print(sayHello1("Guibs"))

    //: 函数的参数和返回值

    //: 多重输入参数

    // 函数可以有多个输入参数, 写在圆括号中, 用逗号分割

    func halfOpenRangeLength(start: Int, end: Int) -> Int {

    return end - start

    }

    print(halfOpenRangeLength(2, end: 4))

    //: 多参量函数

    // 函数可以有多种输入参数

    func sayHello(personName: String, alreadyGreeted: Bool) -> String {

    if alreadyGreeted {

    return "Hello"

    } else {

    return "Hello Again"

    }

    }

    sayHello("Guibs", alreadyGreeted: false)

    //: 无参函数

    // 函数可以没有参数

    func sayHello() -> String {

    return "Hello"

    }

    print(sayHello())

    //: 无返回值函数

    func sayGoodbye(personName: String) {

    print("Goodbye, \(personName)")

    }

    sayGoodbye("Guibs")

    // 严格上来说, 虽然没有返回值被定义, sayGoodbye(_:)函数依然返回了值. 没有定义返回值类型的函数会返回特殊的值, 叫Void. 它其实是一个空的元组, 没有任何元素, 可以写成()

    //: 无返回值的函数调用有返回值的函数

    func printAndCount(stringToPrint: String) -> Int {

    print(stringToPrint)

    return stringToPrint.characters.count

    }

    func printWithoutCount(stringToPrint: String) {

    printAndCount(stringToPrint)

    }

    printAndCount("Guibs")

    printWithoutCount("Guibs")

    // 返回值可以被忽略, 但定义了有返回值的函数必须返回一个值, 如果在函数定义底部没有返回值, 并且试图这样做, 将导致编译错误

    //: 多重返回值函数

    // 可以用元组类型让多个值作为一个复合值从函数中返回

    func minMax1(array: [Int]) -> (min: Int, max: Int) {

    var min = array[0]

    var max = array[0]

    for value in array {

    if value < min {

    min = value

    }

    if value > max {

    max = value

    }

    }

    return (min, max)

    }

    let result1 = minMax1([3, 1, 5, -9, 23])

    result1.min

    result1.max

    // 元组在函数返回类型中定义了名字, 所以不需要在返回时命名

    //: 元组可选返回类型

    // 元组可选类型(如(Int, Int)?) 与元组包含可选属性(如(Int?, Int?))是不同的. 可选的元组类型, 整个数组是可选的, 而不是元组中的每个元素的值

    func minMax2(array: [Int]) -> (min: Int, max: Int)? {

    if array.isEmpty {

    return nil

    }

    var currentMin = array[0]

    var currentMax = array[0]

    for value in array {

    if value < currentMin {

    currentMin = value

    }

    if value > currentMax {

    currentMax = value

    }

    }

    return (currentMin, currentMax)

    }

    var arrays = [Int]()

    let result2 = minMax2(arrays)

    result2

    //: 函数的参数名称

    // 函数的参数都有一个外部参数名和一个本地参数名. 外地参数名用来标记传递给函数调用的参数, 本地参数名在实现函数的时候使用

    func someFunction1(firstParaName p1: Int, secondParaName p2: Int) {

    // statements

    }

    someFunction1(firstParaName: 1, secondParaName: 2)

    // 一般情况下, 第一个参数省略其外部参数名, 第二个以后的参数使用其本地参数名作为自己的外部参数名. 所有的参数都需要有不同的本地参数名, 但可以共享相同的外地参数名

    func someFunction2(firstParaName: Int, secondParaName: Int) {

    // statements

    }

    someFunction2(1, secondParaName: 2)

    // 如果你不想为第二个以及后续参数设置参数名, 用一个下划线(_)代替一个明确的参数名

    func someFunction3(firstParaName: Int, _ secondParaName: Int) {

    // statements

    }

    someFunction3(1, 2)

    //: 默认参数值

    // 你可以在函数体中为每个参数定义默认值. 当默认值被定义后, 调用这个函数时可以忽略这个参数的赋值操作

    func funcWithDefaultPara(para: String = "Guibs") {

    print("Hello \(para)")

    }

    funcWithDefaultPara()

    funcWithDefaultPara("RIO_G")

    // 注意: 将带有默认值的参数放在函数参数列表的最后

    //: 可变参数

    // 一个可变参数可以接受零个或多个值

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

    var total: Double = 0

    for number in numbers {

    total += number

    }

    return total / Double(numbers.count)

    }

    var result = arithmeticMean(1, 2, 3)

    result = arithmeticMean(1.1, 2, 5.9)

    // 如果你的函数有一个或者多个参数有默认值, 还有一个可变参数, 请将可变参数放在参数列表的最后

    //: 常量参数和变量参数

    // 函数参数默认是常量, 可以通过才参数名前加关键字var 来定义变量参数

    func alignRight(var string: String, totalLength: Int, pad: Character) -> String {

    let amountToPad = totalLength - string.characters.count

    if amountToPad < 1 {

    return string

    }

    let padString = String(pad)

    for _ in 1...amountToPad {

    string = padString + string

    }

    return string

    }

    let orginalString = "Hello"

    let paddedString = alignRight(orginalString, totalLength: 10, pad: "-")

    //: 输入和输出参数

    // 如果想要一个函数可以修改参数的值, 并且想要在这些修改在函数调用结束后仍然存在, 那么就应该把这个参数定义为输入输出参数, 在参数定义前加inout 关键字

    // 只能将变量作为输入输出参数, 不能传入常量或者字面量, 因为这二者是不能被修改的. 当传入的参数作为输入输出参数时, 需要在参数前加& 符号, 表示这个值可以被修改

    // 输入输出参数不能有默认值, 可变参数不能用inout 标记. 如果你用inout 标记一个参数, 就不能再用var 或者let 标记

    func swapTwoInts(inout a: Int, inout _ b: Int) {

    let temporaryA = a

    a = b

    b = temporaryA

    }

    var a1 = 1

    var a2 = 2

    swapTwoInts(&a1, &a2)

    a1

    a2

    //: 函数类型

    // 每个函数都有特定的函数类型, 由函数的参数类型和返回类型组成

    func addTwoInts(a: Int, _ b: Int) -> Int {

    return a + b

    }

    func multiplyTwoInts(a: Int, _ b: Int) -> Int {

    return a * b

    }

    // 这两个函数的类型是(Int, Int) -> Int

    func printHelloWorld() {

    print("Hello World")

    }

    // 这个函数的类型是() -> Void

    //: 使用函数类型

    var mathFunction: (Int, Int) -> Int = addTwoInts

    var fucResult = mathFunction(2, 3)

    //: 函数类型作为参数类型

    func printMathResult(mathFunction: (Int, Int) -> Int, _ a: Int, _ b: Int) {

    mathFunction(a, b)

    }

    printMathResult(mathFunction, 2, 3)

    //: 函数类型作为返回类型

    func 加一(number: Int) -> Int {

    return number + 1

    }

    func 减一(number: Int) -> Int {

    return number - 1

    }

    func returnFunc(choose: Int) -> (Int) -> Int {

    if choose == 1 {

    return 加一

    } else {

    return 减一

    }

    }

    var returnFunction = returnFunc(1)

    returnFunction(2)

    //: 嵌套函数

    func getSalary(addSalary: Bool) -> (Int, Int) -> Int {

    func add(s: Int, a: Int) -> Int {

    return s + a

    }

    func jian(s: Int, j: Int) -> Int {

    return s - j

    }

    return addSalary ? add: jian

    }

    var salaryResult = getSalary(true)

    salaryResult(1000, 200)

    salaryResult = getSalary(false)

    salaryResult(1000, 200)

    相关文章

      网友评论

        本文标题:Swift 2.0 学习笔记 6_函数

        本文链接:https://www.haomeiwen.com/subject/xdqgcttx.html