Prima di tutto, qualsiasi funzione restituisce qualcosa (una tupla vuota almeno) anche se non si dichiara alcun tipo di reso.
(@noreturn è obsoleto, vedi 3 Update Swift sotto). No, ci sono funzioni che terminano il processo immediatamente e non ritorno al chiamante. Questi sono contrassegnati in Swift con @noreturn
, come
@noreturn public func fatalError(@autoclosure message:() -> String = default, file: StaticString = #file, line: UInt = #line)
@noreturn public func preconditionFailure(@autoclosure message:() -> String = default, file: StaticString = #file, line: UInt = #line)
@noreturn public func abort()
@noreturn public func exit(_: Int32)
e ci possono essere più.
(Nota: annotazioni simili esistono in altri linguaggi di programmazione o compilatori, come ad esempio [[noreturn]]
in C++ 11, __attribute__((noreturn))
come estensione GCC, o _Noreturn
per il compilatore Clang .)
Puoi contrassegnare la propria funzione con @noreturn
se termina anche il processo incondizionatamente, es. chiamando una delle funzioni built-in, come ad esempio
@noreturn func myFatalError() {
// Do something else and then ...
fatalError("Something went wrong!")
}
Ora è possibile utilizzare la funzione nella clausola else di un'istruzione guard
:
guard let n = Int("1234") else { myFatalError() }
@noreturn
funzioni possono anche essere usato per marcare i casi che "non dovrebbe verificarsi " e indicare un errore di programmazione.Un semplice esempio (un estratto Missing return UITableViewCell):
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell: MyTableViewCell
switch (indexPath.row) {
case 0:
cell = tableView.dequeueReusableCellWithIdentifier("cell0", forIndexPath: indexPath) as! MyTableViewCell
cell.backgroundColor = UIColor.greenColor()
case 1:
cell = tableView.dequeueReusableCellWithIdentifier("cell1", forIndexPath: indexPath) as! MyTableViewCell
cell.backgroundColor = UIColor.redColor()
default:
myFatalError()
}
// Setup other cell properties ...
return cell
}
Senza myFatalError()
contrassegnato come @noreturn
, il compilatore lamentare un ritorno mancante nel caso predefinito.
Aggiornamento: In Swift 3 (Xcode 8 beta 6) l'attributo @noreturn
è stato sostituito da un tipo Never
ritorno, quindi l'esempio sopra sarebbe ora essere scritto come
func myFatalError() -> Never {
// Do something else and then ...
fatalError("Something went wrong!")
}
Dai un'occhiata a: http: // stack overflow.com/questions/27829132/convincing-swift-that-a-function-will-never-return-due-to-a-thrown-exception –