Ho giocato con Swift e ho scoperto che quando eseguivo il casting di un oggetto da inserire in un dizionario, ricevo uno strano avviso: Treating a forced downcast to 'String' as optional will never produce 'nil'
. Se sostituisco as
con as?
, l'avviso scompare.Trattare un downcast forzato come facoltativo non produrrà mai 'nil'
func test() -> AnyObject! {
return "Hi!"
}
var dict = Dictionary<String,String>()
dict["test"]=test() as String'
la documentazione di Apple dice il seguente
Perché downcasting può fallire, l'operatore di tipo fuso è disponibile in due forme diverse. Il modulo facoltativo,
as?
, restituisce un valore facoltativo del tipo a cui si sta tentando di eseguire il downcast. La forma forzata,as
, tenta il downcast e forza il risultato come una singola azione composta.
Sono poco chiaro il motivo per cui utilizzando as?
invece di as
è corretto qui. Alcuni test rivelano che se cambio test() per restituire un Int al posto di una stringa, il codice si chiuderà con un errore se continuo a utilizzare as
. Se si passa a utilizzare as?
, il codice continuerà normalmente l'esecuzione e salterà tale istruzione (il dtt rimarrà vuoto). Tuttavia, non sono sicuro del motivo per cui è preferibile. A mio parere, preferirei che il programma si interrompesse con un errore e fammi sapere che il cast non ha avuto successo, quindi ignora semplicemente l'affermazione errata e continua a eseguire.
Secondo la documentazione, dovrei usare la forma forzata "solo quando sei sicuro che il downcast avrà sempre successo". In questo caso sono sicuro che il downcast avrà sempre successo poiché so che lo test()
può restituire solo una stringa, quindi suppongo che questa sia una situazione perfetta per la forma forzata di down casting. Allora perché il compilatore mi sta dando un avvertimento?
Prima di tutto, c'è un sacco di cacao tipo bridging in corso, perché senza 'importazione Foundation', non sarebbe nemmeno compilare, perché' STRING' non è un tipo di classe e non è compatibile con 'AnyObject'. Se cambi l'ultimo 'String' in' NSString', l'avviso scompare, il che significa probabilmente che si tratta di un problema con te che usa 'String', un tipo non di classe, in' as'. – newacct
@newacct È interessante notare che se si sostituisce String con NSString nella definizione Dizionario o downcast, l'avviso scompare. Se si sostituisce String with NSString in ** both ** places, tuttavia, l'avviso rimane. – Pamelloes
** NOTA **: Da Swift 2, molte delle funzionalità di 'as' sono state rimosse e sono state sostituite con' as! '. Così otterrai lo stesso errore quando usi 'as!'(usando' as' non genererà più questo errore) – Honey