如何在Swift中返回带有inout参数和返回类型为Void的函数?

时间:2015-07-20 17:10:36

标签: ios swift function

我试图通过viewController viewDidLoad函数在Xcode 6.0 playground和iOS项目中运行此代码,并且在这两个设置中程序都会崩溃编译器。当程序通过游乐场运行时,我已经阅读了当返回inout函数时遇到类似问题的人,但是当他们通过项目运行程序时问题得到了解决。我的代码是不正确的,如果是的话有什么问题,或者我在游乐场或项目中错误地运行代码?

// testingPlayground
// July 18, 2015


func chooseFunction(isYNegative lessThanZero: Bool) -> (inout Int) -> Void {
    func increaseY(inout #yValue: Int){ // Increases yValue
        yValue += 1
    }

    func decreaseY(inout #yValue: Int){ // Decreases yValue
        yValue -= 1
    }

    return lessThanZero ? increaseY : decreaseY // Returns either the increase or decrease yValue function
}


var yValue = -1
var changeYFunction = chooseFunction(isYNegative: yValue < 0)


while yValue != 0 {
    changeYFunction(&yValue) // Increments/Decrements yValue
}

1 个答案:

答案 0 :(得分:0)

#内的#yValue: Int个参数中移除chooseFunction后,代码可以正常使用(#意味着必须给出参数名称,你不这样做。)

或者,您需要在返回类型chooseFunction中指定参数名称,并在调用返回的函数时使用它,即:

func chooseFunction(isYNegative lessThanZero: Bool) -> ((inout yValue: Int) -> Void) {

changeYFunction(yValue: &yValue)

换句话说,问题在于您与返回的函数是否需要参数的名称不一致。

编辑:作为另一种选择,您可以考虑重构整个内容,例如,使用curried函数的简写:

func stepper(increase increase: Bool)(inout _ y: Int) {
    increase ? ++y : --y
}
var y = -5
let step = stepper(increase: y < 0)
while y != 0 {
    step(&y)
}

事实上,即使是以下工作,虽然需要多毛的语法让我警惕:

func stepper(increase increase: Bool)(inout _ y: Int)() {
    increase ? ++y : --y
}
var y = -5
let stepY = stepper(increase: y < 0)(&y)
while y != 0 {
    stepY()
}