Swift 学习之函数

Swift 学习之函数

// 1. 定义函数
func sayHello(personName:String) ->String
{
    let greeting = "Hello, \(personName)"
    return greeting
    // 简化函数可以合并,之间reture 返回结果
   // return "Hello, \(personName)"
}

/** 函数说明
func               是函数的声明标记
sayHello(){}       函数的主体
personName:String  形参且为String类型
->String           函数带返回值且返回值为String类型
*/

// 2.调用函数
let greet = sayHello("apple")
println(greet)    // 打印 : Hello, apple


// 3.函数的形参和返回值

// 3.1 函数可以有多个形参,再函数的括号内用" , "隔开
func numrang(start :Int,end :Int) ->Int
{
    return end - start
}

println(numrang(1,10)) // 打印: 9


//3.2 无形参函数
func sayHello() ->String{
return "hello,world"
}

println(sayHello())   // 打印:  hello,world

//3.3 无返回值参数

func sayGoodbay(personName: String)
{
    println("Goodbay \(personName)")
}

sayGoodbay("apple")  // 打印: Goodbay apple
/*严示:严格地说,sayGoodbye 函数确实还返回一个值,即使没有定义返回值。没有 定义返回类型的函数返回了一个 Void 类型的特殊值。这仅是一个空元组,这里边没有元素,可以被写成()。*/

// 当一个函数调用时可以忽略返回值不计
func printAndCount(printString: String) -> Int
{
    println(printString)
    return countElements(printString)
}

func printWithCount(printString: String)
{
    printAndCount(printString)
}

printAndCount("apple")    // 打印: apple  忽略了返回值
printWithCount("apple")   // 打印: apple  没有返回值

// 返回值可以忽略,当定义了有返回值的函数,函数内部必须有返回值,不然会报错

// 3.4 多返回值函数
// 同时返回数组内最大值和最小值

func returnMaxAndMin(array: [Int])-> (maxValue: Int,minValue: Int)
{
    var currentMin = array[0]
    var currentMax = array[0]
    
    for value in array
    {
        if currentMax < value
        {
            currentMax = value
        }
        if currentMin > value
        {
            currentMin = value
        }
    }
    return (currentMax,currentMin)
}

let maxAndmin = returnMaxAndMin([48,-30,22,99,12])

println("maxvalue = \(maxAndmin.maxValue)  minValue = \(maxAndmin.minValue)")

// 打印: maxvalue = 99  minValue = -30

// 3.5 可选的元组返回类型
// 如果数组为空将返回错误,因此返回的元组应该为可选类型,可以为nil

func minAndmax(array: [Int])->(minValue:Int,maxValue:Int)?
{
    if array.isEmpty {return nil};

    var currenMin = array[0];
    var currenMax = array[0];
    
    for value in array
    {
        if value > currenMax
        {
            currenMax = value
        }
        if value < currenMin
        {
            currenMin = value
        }
    }
    return (currenMin,currenMax)
}

// 调用函数

let tuple = minAndmax([]) // 传入空数组
println(tuple)            // 打印:nil  因为返回的类型为可选类型可以为nil


// 4. 函数形参名称

/** 外部形参名
函数的形参只能内部使用,如果函数外部想使用函数内部的形参,需要给函数形参定义一个外部形参名称
*/

func someFunction (externalParameterName localParametername:Int )
{
}
/*
externalParameterName 外部形参名称
提示:如果您为形参提供一个外部形参名称,那么外部形参名必须在调用时使用。
*/

// 4.1  定义带外部形参的函数

func externalParameterFunc(firstNum num1:Int, secondNum num2:Int, jionCharacter c:String) ->String
{
    return ("\(num1) \(c) \(num2)")

}

// 使用带外部形参的函数, **带外部参数的函数,调用时必须带外部参数
let result = externalParameterFunc(firstNum: 2, secondNum: 3, jionCharacter: "+")
println(result) // 打印: 2 + 3

/*注意:
在别人第一次阅读你的代码不知道你函数形参目的时候,就要考虑到使用外
部形参名称了。在调用函数的时候,如果每个形参的目的清晰明确的话,那你就无需
指定外部形参名。
*/

// 4.2 外部参数的速记  速记标记  #
// 如果再函数的内部的形参前加 # ,内部的形参名称可当外部形参使用

// 创建速记外部参数
func externalParamer (#num1:Int,#num2: Int,#joinCharacter: String)->String
{
    return ("\(num1) \(joinCharacter) \(num2)")
}

let resultString = externalParamer(num1: 3, num2: 2, joinCharacter: "-")  // 速记形参
println(resultString)   // 打印:  3 - 2


// 4.3 默认形参值,
// 设置 joinCharacter 默认为空字符
func join(#num1:Int, #num2:Int,join joinCharacter: String = " ")->String
{
    return ("\(num1)\(joinCharacter)\(num2)")
}

// 传入join
let joinResult = join(num1: 1, num2: 1,join:"=")
println(joinResult)      // 打印: 1=1

// 调用函数,join不传入,将以默认为" "
let joinResult2 = join(num1: 1, num2: 1)
println(joinResult2)      // 打印: 1 1   用空字符填充 join的位置

// 4.4 有默认值的外部形参名
//当定义了默认的字符,外部可以只用使用函数的参数,相等于加了 #

func joinFunc(num1: Int,num2: Int,join: String = "+")->String
{
    return ("\(num1)\(join)\(num2)")

}

// 当不传入join 值时
let joinresult3 = joinFunc(5,6)
println(joinresult3)      // 打印: 5+6

// 当传入join 值时
let joinresult4 = joinFunc(5, 6, join: "-")
println(joinresult4)      // 打印: 5-6


// 5. 可变形参

/*
一个可变形参可接受零个或多个指定类型的值。
当函数被调用时,你可以使用可变形参来 指定--形参可以用来传递任意数量的输入值。
可通过在形参的类型名后边插入三个点符号(...)来编写可变形参。
传递至可变形参的值在函数主体内是以适当类型的数组存在的.

例如,一个可变参数的名称
为 numbers 和类型为 Double...在函数体内就作为名为 numbers 类型为 Double[]的常量数组。
*/

func canchange(numbers: Double...) ->Double
{
    var total : Double = 0
    for number in numbers{
      total += number
    }
    
    return total / (Double)(numbers.count)
}

// 调用可变参数的名称
let resultDouble = canchange(1,2,3,4,5)
println(resultDouble)   // 打印: 3.0

let resultDouble2 = canchange(2.5,3.6,4.7,5.8)
println(resultDouble2)  // 打印: 4.15


// 6.常量形参和变量形参
/*
函数的形参默认是常量。试图在函数体内改变函数形参的值会引发一个编译时错误。这意
味着你不能错误地改变形参的值。

可在形参前定义为var 形参可变, 改变形参的值,就无需再函数内部重新定义可变的值
*/

func addCharacter(var string: String, count: Int, pad: Character) -> String
{
    let amount = count - countElements(string)
    
    if amount < 1 {return string}

    for _ in 1...amount
    {
    string = String(pad) + string
    
    }
    
    return string
}

let addString = addCharacter("swift", 10, "*")

println(addString)   // 打印:  *****swift

/*
注意:你对变量形参所做的改变不会比调用函数更持久,并且在函数体外是不可见
的。变量形参仅存在于函数调用的声明周期中。
*/

// 7. In-Out 形参

/*
变量形参只能在函数本身内改变。
如果你想让函数改变形参值,并想要在函数调用结束后保持形参值的改变,那你可以把形参定义为 in-out 形参。
你不能传递一个常量或者字面量作为实参,因为常量和字面量不能被修改。当你把变量作为实参传递给 in out 形参时,需要在直 接在变量前添加 & 符号,以表明它可以被函数修改。
提示:in-out 参数不能有默认值,可变参数的参数也不能被标记为 inout。如果您标记 参数为 inout,它不能同时被标记为 var 或 let。
*/

func swapTwoInts (inout a: Int,inout b: Int)
{
    let temp = a
    a = b
    b = temp
}


var someInt = 3
var anotherInt = 5

// 需要出入两个参数的地址
swapTwoInts(&someInt, &anotherInt)

println(someInt)       // 打印: 5
println(anotherInt)    // 打印: 3
/*
In-out 形参不同于从函数返回一个值。上边 swapTwoInts 例子没有定义返回类 型或者返回值,
但它仍然会修改 someInt 和 anotherInt 的值。对函数来说,In-out 形 参是一个影响函数主体范围外的可选方式。
*/

// 8. 函数类型
// 8.1 使用函数类型

// 函数类型 (Int,Int)->Int
func 加(a: Int,b: Int)->Int
{
    return a+b
}

func 乘(a: Int,b: Int)->Int
{
    return a*b
}

var 临时函数: (Int,Int)->Int = 加    // : (Int,Int)->Int  部分可以省略,Swift会
println(临时函数(2,3))  // 打印: 5

临时函数 = 乘
println(临时函数(2,3))  // 打印: 6


// 8.2 作为形参类型的函数类型

func printMathResult(math:(Int,Int) -> Int,a :Int,b :Int)
{
    println("result: \(math(a,b))")
}
// 调用
printMathResult(加, 3, 5)  // 打印: 8

// 8.3 作为返回类型的函数类型  “Function Types as Return Types”
/*
可以将一个函数类型作为另一个函数的返回类型。
你可以在返回函数的返回箭头(->) 后立即编写一个完整的函数类型来实现。
*/


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

}

func stepBackward(input: Int) ->Int
{
    return input - 1;
}


func chooseStep(ward: Bool)-> (Int)->Int
{
    return ward ?stepBackward : stepForward
}

var currentValue = 5
let moveNear = chooseStep(currentValue > 0)  // 返回函数为真的函数

while currentValue != 0
{
    println(currentValue)
    currentValue = moveNear(currentValue)
}
/*
5
4
3
2
1
*/

// 9.嵌套函数 Nested Functions
// 在其他函数体中定义函数,被称为嵌套函数。

func chooseStep2(ward: Bool)-> (Int)->Int
{
    func stepForward(input: Int) ->Int
    {
        return input + 1;
        
    }
    
    func stepBackward(input: Int) ->Int
    {
        return input - 1;
    }
    
    return ward ?stepBackward : stepForward
}

var currentValue2 = -5
let moveNear2 = chooseStep2(currentValue > 0)  // 返回函数为真的函数

while currentValue2 != 0
{
    println(currentValue2)
    currentValue2 = moveNear2(currentValue2)
}
/*
-5
-4
-3
-2
-1
*/


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值