天天看點

Swift 函數嵌套

Swift支援函數嵌套,這讓在函數中傳回其他函數變成了一種可能。不過其中也存在着一些陷阱。

Example 1:

import Foundation
func OuterFunc(a:Int)->(Int)->Int
{
    var start=
    func InnerFunc(b:Int)->Int
    {
        start+=a*b
        return start
    }
    return InnerFunc
}

var funtest=OuterFunc()

print(funtest())    // 10, start = 10 after execute this time
print(funtest())    // 20                

Example 2:

a.

import Foundation

func OuterFunc(a:Int)->Int
{
    var start=
    func InnerFunc(b:Int)->Int
    {
        start+=a*b
        return start
    }
    return InnerFunc()*InnerFunc(a)
}

print(OuterFunc())// return 140 10*(10+4)                

b.

import Foundation

func OuterFunc(a:Int)->Int
{
    var start=
    func InnerFunc(b:Int)->Int
    {
        start+=a*b
        return start
    }
    return InnerFunc(a)*InnerFunc()
}

print(OuterFunc()) //return 56 4*(4+10)                

在以上兩個例子中start變量的值會因為之前有過調用而變為非初始值,是以造成了

Example 1:

相同參數傳回不同結果。

Example 2:

更改函數調用順序傳回不同結果。

總結:

1.變量要在函數内部(每次調用函數)初始化。

2.如果相同變量傳回值不同,排查函數内部使用變量