Questa domanda è probabilmente opinione basa, in modo da prendere la mia risposta con un grano di sale, ma non direi che la forza abbattuto è sempre male; devi solo considerare la semantica e come si applica in una determinata situazione.
as! SomeClass
è un contratto, in pratica dice "Garantisco che questa cosa è un'istanza di SomeClass". Se si scopre che non è SomeClass, verrà generata un'eccezione perché hai violato il contratto.
È necessario considerare il contesto in cui si sta utilizzando questo contratto e quali azioni appropriate è possibile intraprendere se non si utilizza il downcast forzato.
Nell'esempio si dà, se dequeueReusableCellWithIdentifier
non ti dà un MyOffersViewCell
allora probabilmente avete configurato male qualcosa a che fare con l'identificatore riutilizzo delle cellule e un'eccezione vi aiuterà a trovare quel problema.
Se si è utilizzato un downcast condizionale, si otterrà zero e si dovrà gestirlo in qualche modo - Registrare un messaggio? Lanciare un'eccezione? Rappresenta certamente un errore irrecuperabile e qualcosa che vuoi trovare durante lo sviluppo; non ti aspetteresti di dover gestire questo dopo il rilascio. Il tuo codice non inizierà improvvisamente a restituire diversi tipi di celle. Se si lascia che il codice si arresti in modo anomalo, verrà indirizzato direttamente alla riga in cui si è verificato il problema.
Ora, considerare un caso in cui si accede ad alcuni JSON recuperati da un servizio Web. Potrebbe esserci un cambiamento nel servizio web al di fuori del tuo controllo, quindi gestirlo con più eleganza potrebbe essere bello. La vostra applicazione potrebbe non essere in grado di funzionare, ma almeno si può mostrare un avviso, piuttosto che semplicemente schiantarsi:
male - si blocca se JSON non è una matrice
let someArray=myJSON as! NSArray
...
Meglio - Handle non valido JSON con un avviso
guard let someArray=myJSON as? NSArray else {
// Display a UIAlertController telling the user to check for an updated app..
return
}
direi utilizzando forzare lo srotolamento è accettabile. Finché sai cosa stai facendo. Ma nella tua situazione particolare, l'utilizzo dello scompartimento opzionale sarà migliore. Puoi controllare se la cella restituita da 'dequeueReusableCellWithReuseIdentifier' è il tipo di' MyOffersViewCell'. Se è così, fai quello che vuoi, se no, restituisci semplicemente "UITableViewCell", nessun problema. –