我试图通过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
}
答案 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()
}