加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Swift学习笔记(四)函数

发布时间:2020-12-14 01:54:04 所属栏目:百科 来源:网络整理
导读:定义和调用函数 参数名personName,参数类型String 返回值类型是String func sayHello (personName: String) - String{ let greeting = "hello," + personName + "!" return greeting;}println(sayHello( "John" ))func halfOpenRangeLength (start: Int,end:

定义和调用函数 参数名personName,参数类型String 返回值类型是String

func sayHello(personName: String) -> String{
    let greeting = "hello," + personName + "!"
    return greeting;
}
println(sayHello("John"))

func halfOpenRangeLength(start: Int,end: Int) -> Int {
    return end - start
}
println(halfOpenRangeLength(1,10))
// prints "9"

函数的多返回值元组(此处的返回值声明了变量名:方便调用函数时可以使用变量名获取值)

func minMax(array: [Int]) -> (min: Int,max: Int) {
    var currentMin = array[0]
    var currentMax = array[0]
    for value in array[1..<array.count] {
        if value < currentMin {
            currentMin = value
        } else if value > currentMax {
            currentMax = value
        }
    }
    return (currentMin,currentMax)
}

let bounds = minMax([8,-6,2,109,3,71])
println("min is (bounds.min) and max is (bounds.max)")
// prints "min is -6 and max is 109"

函数的可选元组返回类型

func minMax(array: [Int]) -> (min: Int,max: Int)? {
    if array.isEmpty { return nil }
    var currentMin = array[0]
    var currentMax = array[0]
    for value in array[1..<array.count] {
        if value < currentMin {
            currentMin = value
        } else if value > currentMax {
            currentMax = value
        }
    }
    return (currentMin,currentMax)
}
if let bounds = minMax([8,71]) {
    println("min is (bounds.min) and max is (bounds.max)")
}
// prints "min is -6 and max is 109"

函数的参数名:本地参数名和外部参数名
一、本地参数名:本地参数名就是定义函数名时,在参数列表中所写的参数名,它只能在函数主体内使用

二、外部参数名:帮助理解参数的目的,更好的表达参数的功能,就需要在定义时使用外部参数名,外部参数名需要卸载本地参数名之前,并使用空格将其分开

三、如果调用时使用外部参数,则在调用该函数时需要使用外部参数名
*外部参数名不能在函数主体内使用
*如果开发者想为函数的参数提供一个外部参数名,而本地参数名已经使用了一个合适的名称,这时就不需要再为该函数写相同的两次名称了,取而代之,写一次名称,并用”#”号作为名称的前缀

func someFunction(parameterName: Int) {
   //parameterName是本地参数名
   //调用时不写参数名
}

func someFunction(externalParameterName localParameterName: Int) {
   //externalParameterName是外部参数名 
   //localParameterName是本地参数名 
   //调用时需要写外部参数名
}

func someFunction(#localParameterName: Int) {
   //#用来标识参数即是本地参数名又是外部参数名
}
someFunction(2)
someFunction(externalParameterName: 2)
someFunction(localParameterName: 2)

设置函数参数的默认参数值(调用时传值了,则使用传的值,否则使用默认值)

func join(string s1: String,toString s2: String,withJoiner joiner: String = " ") -> String {
    return s1 + joiner + s2
}

join(string: "hello",toString: "world",withJoiner: "-")
// returns "hello-world"
join(string: "hello",toString: "world")
// returns "hello world"

可变参数:使一个参数接受0个或多个指定类型的值,设定一个可变参数需要在参数类型名添加”…”
一个函数中只能有一个可变参数,且可变参数的位置必须是所有的之后

func arithmeticMean(numbers: Double...) -> Double {
    var total: Double = 0
    for number in numbers {
        total += number
    }
    return total / Double(numbers.count)
}
arithmeticMean(1,4,5)
// returns 3.0,which is the arithmetic mean of these five numbers
arithmeticMean(3,8.25,18.75)
// returns 10.0,which is the arithmetic mean of these three numbers

常量参数和变量参数
函数的参数默认都是let常量,如果尝试去改变参数的值就会出现编译错误
如果想要在函数主体内对参数进行修改,你可以使用变量参数,即在参数名前加”var”关键字
变量参数的作用范围是在整个函数体内

func alignRight(var string: String,count: Int,pad: Character) -> String {
// let stringCount = count(string)
    let amountToPad = count - 5
    if amountToPad < 1 {
        return string
    }
    let padString = String(pad)
    for _ in 1...amountToPad {
        string = padString + string
    }
    println(string)
    return string
}
let originalString = "hello"
let paddedString = alignRight(originalString,10,"-")
// paddedString is equal to "-----hello"
// originalString is still equal to "hello"

输入输出参数:
如果你想修改一个参数值,并且在函数调用之后仍然有效,这时就可以使用输入输出参数
在参数名前加”inout”关键字来定义输入输出参数
输入输出参数不能有默认值
当你使用了inout修饰时就不能再使用var或者let
调用时,必须在参数前加”&”符号

func swapTwoInts(inout #a: Int,inout #b: Int) {
    let temporaryA = a
    a = b
    b = temporaryA
}
var someInt = 3
var anotherInt = 107
swapTwoInts(a: &someInt,b: &anotherInt)
println("someInt is now (someInt),and anotherInt is now (anotherInt)")
// prints "someInt is now 107,and anotherInt is now 3"

函数类型
每一个函数都有一个特定的函数类型,由参数类型和返回值类型共同决定

func addTwoInts(a: Int,b: Int) -> Int {
    return a + b
}
func multiplyTwoInts(a: Int,b: Int) -> Int {
    return a * b
}
//上面两个函数的类型都是 (Int,Int) -> Int

函数类型的使用:定义一个变量mathFunction,其是一个函数类型,指向addTwoInts函数

var mathFunction: (Int,Int) -> Int = addTwoInts
println("Result: (mathFunction(2,3))")

与其他类型一样,当你为一个常量或变量分配一个函数时,你可以把它推断函数类型

let anotherMathFunction = mathFunction

函数类型做参数类型
当函数的提供者提供的函数被调用时,会使你脱离了一个函数某些方面的具体实现
如下示例:addTwoInts,3,5做参数,当调用mathFunction(a,b),实际上会调用addTwoInts(3,5)
这就使得开发者本身不用关系addTwoInts的实现

func printMathResult(mathFunction: (Int,Int) -> Int,a: Int,b: Int) { println("Result: (mathFunction(a,b))") } printMathResult(addTwoInts,5) // prints "Result: 8"

函数类型做返回值类型
stepForward和stepBackward的函数类型都是(Int) -> Int

func stepForward(input: Int) -> Int {
    println(input+1)
    return input + 1
}
func stepBackward(input: Int) -> Int {
    println(input-1)
    return input - 1
}

chooseStepFunction的返回值类型是函数类型(Int) -> Int

func chooseStepFunction(backwards: Bool) -> (Int) -> Int {
    return backwards ? stepBackward : stepForward
}

var currentValue = 3
let moveNearerToZero = chooseStepFunction(currentValue > 0)
// moveNearerToZero now refers to the stepBackward() function
moveNearerToZero(10)
//prints "9"

嵌套函数
嵌套函数默认情况下对外界是隐藏的,但是仍然可以调用和使用其内部的函数
内部函数也可以返回一个嵌套函数,允许在嵌套函数内的另一个范围内使用。

func chooseStepFunction2(backwards: Bool) -> (Int) -> Int {

    func stepForward(input: Int) -> Int {
        return input + 1
    }

    func stepBackward(input: Int) -> Int {
        return input - 1
    }
    return backwards ? stepBackward : stepForward
}
var currentValue2 = -4
let moveNearerToZero2 = chooseStepFunction2(currentValue2 > 0)
// moveNearerToZero now refers to the nested stepForward() function
while currentValue2 != 0 {
    print("(currentValue2),")
    currentValue2 = moveNearerToZero2(currentValue2)
}
println("zero!")
// -4,-3,-2,-1,zero!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读