Si consideri il seguente insieme di funzioni:Soppressione ritorni impliciti a 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)
}
Sembra che nel caso in cui 1, Swift sta cercando di tornare implicitamente dalla chiusura in quanto la funzione someFunc()
restituisce un valore. Lo fa solo se c'è una sola linea nella chiusura (Ritorno implicito dalle chiusure a espressione singola) - questo è il motivo per cui il caso 2 funziona. Non lo fa se la funzione, come nel caso 3 è Void
, cioè non restituisce un valore.
La mia domanda è se esiste un modo per sopprimere questo comportamento in modo che possa avere una funzione con un valore di ritorno come un'espressione a riga singola in una chiusura che non ha alcun valore di ritorno.
"someFunc ($ 0); return"? Cosa c'è di sbagliato con due linee – sanz
Questo sembra un bug. (@tony non c'è motivo per cui dovresti aggiungere righe aggiuntive per questo caso.) L'inferenza di tipo dovrebbe tener conto del fatto che 'testFunc' prende una chiusura che non restituisce nulla' ->() 'e dovrebbe sopprimere opportunamente il ritorno automatico di la chiusura a espressione singola. Si prega di segnalarlo a https://bugreport.apple.com/ –
Un bug ha più senso ... Ho pensato che stavo impazzendo. Segnalazione di bug inviata, grazie! –