2016-08-27 12 views
5

Ilekroć potrzebujemy czegoś z opcjonalną wartością w swift, musimy rozpakować go, aby działał, a nie na opcjonalnym, ale na wartości "wewnątrz" opcjonalnej.Wpisz odlewane opcjonalne wartości

var optionalString:String? = "Hello" 
optionalString!.append(" World!") 

Uwaga wykrzyknik w drugim wierszu.

Ale korzystając z opcjonalnego operatora rzutowania (jak?) Na opcjonalnej wartości, nie trzeba odwijać opcji opcjonalnej, po prostu dostarczamy jej opcjonalne i działa ona po prostu magicznie.

let sneakyString:Any? = "Hello!" 
let notSoSneakyString = sneakyString as? String 

Uwaga na nieobecny wykrzyknik w drugiej linii.

Magia jest nieco bardziej oczywiste, jeśli spell it out:

let sneakyString:Any? = Optional("Hello") 
let notSoSneakyString = sneakyString as? String 

nie jest to ciąg próbujemy rzucić ale enum z ciągiem jako powiązanej wartości.

Spodziewam się, że będę musiał to zrobić:

let sneakyString:Any? = "Hello!" 
let notSoSneakyString = sneakyString! as? String 

Uwaga wykrzyknik na drugiej linii.

Czy operatorzy odlewania typu działają w ten sam sposób na urządzenia opcjonalne i inne opcje?

+0

Może to ma jednak sens. Aby odwijać zero, opcjonalny jest błąd środowiska wykonawczego. I nie rzutujemy z Opcjonalnego (Any) na String, ale z Opcjonalnego (Any) na Opcjonalne (String). – weenzeel

Odpowiedz

1

Operator wykonuje rzut, jeśli to możliwe, i zwraca odlewany obiekt lub nil. Obsługuje również wartości zerowe, więc jeśli sneakyString byłyby zerowe, nie byłbyś w stanie rzucić go do String, a rzutowanie nie powiodło się. To samo zachowanie, jakby było niezerowe, ale nie można go było wyłaczyć na String.

Innymi słowy, nie potrzebujesz !, ponieważ as? automatycznie obsługuje wartości zerowe.

+0

Tak, przypadek zerowy jest nieco bardziej logiczny. Zmieniono moje pytanie, aby wskazać, że operator nie działa na strukturze łańcuchowej, ale na wyliczeniu z ciągiem znaków jako wartością powiązaną. Czy wiesz, czy jest to udokumentowane? – weenzeel