Rozważmy następujący zestaw funkcji:Pomijanie niejawne powraca w 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($0)
}
// case 2 - no error
testFunc() {
println("whatever")
someFunc($0)
}
// case 3 - no error
testFunc() {
someOtherFunc($0)
}
Wygląda jak w przypadku 1, Swift stara się niejawnie powrócić z zamknięciem od funkcji someFunc()
zwraca wartość. Robi to tylko wtedy, gdy w zamknięciu znajduje się tylko jedna linia (Implicit Returns from Single-Expression Closures) - dlatego przypadek 2 działa. Nie robi tego, jeśli funkcja, jak w przypadku 3, jest Void
, tj. Nie zwraca wartości.
Moje pytanie brzmi, czy istnieje sposób, aby powstrzymać to zachowanie, tak, że mogę mieć funkcję z wartością zwracaną jako jedno-wierszowe wyrażenie w zamknięciu, które nie ma wartości zwracanej.
"someFunc ($ 0); return"? Co jest nie tak z dwiema liniami – sanz
To wygląda jak błąd. (@tony nie ma powodu, dla którego powinieneś/powinnaś dodawać dodatkowe linie dla tego przypadku.) Wnioskowanie o typ powinno wychwycić fakt, że 'testFunc' przyjmuje zamknięcie, które niczego nie zwraca' ->() 'i powinno odpowiednio tłumić automatyczny powrót zamknięcie pojedynczej ekspresji. Zgłoś go do https://bugreport.apple.com/ –
Błąd ma więcej sensu ... Myślałem, że zwariowałem. Raport o błędzie przesłany, dzięki! –