Swift中隐含收益的抑制

Swift中隐含收益的抑制,swift,Swift,考虑以下一组函数: func testFunc(someFunc: (Int[]) -> ()) { someFunc([1, 2, 3]) } func someFunc<T>(arr : T[]) -> T[] { return arr } func someOtherFunc<T>(arr : T[]) { println(arr) } // case 1 - ERROR testFunc() { someFunc(

考虑以下一组函数:

func testFunc(someFunc: (Int[]) -> ()) {
    someFunc([1, 2, 3])
}

func someFunc<T>(arr : T[]) -> T[] {
    return arr
}

func someOtherFunc<T>(arr : T[]) {
    println(arr)
}

// case 1 - ERROR
testFunc() {
    someFunc($0)
}

// case 2 - no error
testFunc() {
    println("whatever")
    someFunc($0)
}

// case 3 - no error
testFunc() {
    someOtherFunc($0)
}
func testFunc(someFunc:(Int[])->()){
someFunc([1,2,3])
}
func someFunc(arr:T[])->T[]{
返回arr
}
func someOtherFunc(arr:T[]{
println(arr)
}
//案例1-错误
testFunc(){
someFunc($0)
}
//案例2-无错误
testFunc(){
println(“无论什么”)
someFunc($0)
}
//案例3-无错误
testFunc(){
someOtherFunc($0)
}
在案例1中,Swift试图从闭包隐式返回,因为函数
someFunc()
返回一个值。只有当闭包中只有一行(来自单个表达式闭包的隐式返回)时,它才会这样做——这就是案例2起作用的原因。如果函数(如案例3)为
Void
,即不返回值,则不会执行此操作


我的问题是,是否有一种方法可以抑制这种行为,这样我就可以在没有返回值的闭包中使用返回值为单行表达式的函数。

更新:在Swift 1.2之后,这不再是一个问题

这个bug仍然存在于Xcode beta6中,我希望它能在1.0版本中修复,在此之前,这是一个解决方法

testFunc() {
    someFunc($0)

    // The explicit return statement corrects the wrong return type of the auto implicit return.
    // It makes more sense than printing nonsense strings
    return //TODO: remove after the bug is fixed
}

除上述解决方案外:

testFunc { someFunc($0); return () } // returning Void explicitly (with or without parenthesis)

testFunc { someFunc($0); 42 } // or, indeed, just adding a second expression
您还可以使用返回的值:

testFunc { let x = someFunc($0) }
或者简单地说:

testFunc { _ = someFunc($0) }
返回值必须始终是函数签名承诺的类型,隐式返回的情况也不例外。这不是bug。简单地说,隐式返回常常是如此优雅的语法,以至于不太常见的类型不匹配的情况稍微打破了这个咒语。这并不是说一个好的语法解决方案不受欢迎,至少在预期
Void
时是如此。也许可以简单地说:

testFunc { someFunc($0) ; } // with the trailing semicolon
最让我恼火的是我自己的功能迫使我绕着它跳舞。我有几次求助于显式忽略返回类型:

func testFunc<Ignored>(someFunc: [Int] -> Ignored) {
    someFunc([1, 2, 3])
}

testFunc { someFunc($0) }
func testFunc(someFunc:[Int]->忽略){
someFunc([1,2,3])
}
testFunc{someFunc($0)}

“someFunc($0);返回”?两条线有什么问题这看起来像个虫子。(@tony,没有理由必须为这种情况添加额外的行。)类型推断应该捕捉到这样一个事实:
testFunc
接受一个闭包,该闭包不返回任何内容
->()
,并且应该适当地抑制单个表达式闭包的自动返回。请把它报告给一个更合理的bug。。。我以为我疯了。错误报告已提交,谢谢!刚刚也遇到了这个,看起来更像是一个bugme@NicholasH.字体你为什么认为这是一个“错误”?它完全按照规范所说的去做。你为什么认为它是一个“bug”?它完全按照规范所说的那样运行。@newacct阅读了NicholasH在问题下的评论,我同意他的观点。@newacct另一个来源,在GitHub上,隐式返回引起了一个类似的问题,有人说苹果公司的人已经确认,如果闭包的主体是一个表达式,那么这是一个编译器错误,它是隐式返回的。总是。这就是发生的事情。@newacct我不知道你是从哪里得到这个想法的,至少我在苹果的Swift书里找不到。这本书只说明
没有歧义,return关键字可以省略。
在这个问题中,显然编译器在返回类型推断上犯了错误,outter函数
testFunc
返回Void,但编译器仍然隐式返回闭包的返回值,这是毫无意义和令人困惑的。如果苹果不认为它是一个bug,那我就把它称为陷阱。