as
używany do upcastingu i odlewania typu na mostkowy
as?
używany do bezpiecznego odlewania, zwraca zero, jeśli nie powiodło się
as!
używany do wymuszania rzucania, awaria, jeśli się nie powiodło
Uwaga:
as!
nie można rzutować typu surowego na opcjonalny
Przykłady:
let rawString: AnyObject = "I love swift"
let optionalString: AnyObject? = "we love swift"
let nilString: AnyObject? = (nil as String?)
let rawInt: AnyObject = Int(3)
let optionalInt: AnyObject? = Int(3)
let nilInt: AnyObject? = (nil as Int?)
Przykład
var age: Int? = nil
var height: Int? = 180
Dodając ? zaraz po typie danych informujesz kompilator, że zmienna może zawierać liczbę lub nie. Schludny! Zauważ, że tak naprawdę nie ma sensu definiowanie stałych opcjonalnych - możesz ustawić ich wartość tylko raz, dzięki czemu będziesz mógł powiedzieć, czy ich wartość będzie zerowa, czy nie.
Kiedy powinniśmy używać „?” i kiedy "!"
powiedzmy, że mamy prostą aplikację opartą na UIKit. mamy trochę kodu w naszym kontrolerze widoku i chcemy przedstawić nowy kontroler widoku na wierzchu. i musimy zdecydować o przesunięciu nowego widoku na ekran za pomocą kontrolera nawigacyjnego.
Jak wiemy, każda instancja ViewController ma kontroler nawigacji właściwości. Jeśli tworzysz aplikację opartą na kontrolerze nawigacji, ta właściwość kontrolera widoku głównego aplikacji jest ustawiana automatycznie i możesz jej używać do wypychania lub wyświetlania kontrolerów widoku. Jeśli używasz szablonu projektu pojedynczej aplikacji - nie zostanie utworzony automatycznie kontroler nawigacji, więc domyślny kontroler widoku aplikacji nie będzie zawierał niczego przechowywanego we właściwości navigationController.
Jestem pewien, że już zgadłeś, że jest to dokładnie przypadek dla opcjonalnego typu danych. Jeśli zaznaczysz UIViewController, zobaczysz, że właściwość jest zdefiniowana jako:
var navigationController: UINavigationController? { get }
Wróćmy więc do naszego przypadku użycia. Jeśli wiesz na pewno, że twój kontroler widoku zawsze będzie miał kontroler nawigacji, możesz śmiało wymusić rozpakowanie:
controller.navigationController!.pushViewController(myViewController, animated: true)
Kiedy umieścisz! za nazwą właściwości, którą powiesz kompilatorowi , nie obchodzi mnie, że ta właściwość jest opcjonalna, wiem, że gdy ten kod zostanie wykonany, zawsze będzie magazyn wartości, więc traktuj ten opcjonalny jak normalny typ danych. Czy to nie jest miłe? Co by się jednak stało, gdyby kontroler widoku nie posiadał kontrolera nawigacji? Czy sugestia, że zawsze będzie przechowywana wartość w navigationController, była nieprawidłowa? Twoja aplikacja ulegnie awarii. Proste i brzydkie.
Więc użyj! tylko jeśli masz 101% pewności, że to jest bezpieczne.
A co jeśli nie masz pewności, że zawsze będzie dostępny kontroler nawigacyjny? Wtedy możesz użyć? zamiast !:
controller.navigationController?.pushViewController(myViewController, animated: true)
Co ? za nazwą właściwości mówi kompilatorowi , czy nie wiem, czy ta właściwość zawiera nil, czy wartość, więc: jeśli ma wartość, użyj jej, a poza tym po prostu rozważ całe wyrażenie nil. Skutecznie? pozwala na użycie tej właściwości tylko w przypadku, gdy istnieje kontroler nawigacji. Nie, jeśli chodzi o jakiekolwiek kontrole lub odlewy. Ta składnia jest idealna, gdy nie obchodzi Cię, czy masz kontroler nawigacji, czy nie, i chcesz coś zrobić tylko wtedy, gdy jest.
Ogromne podziękowania dla Fantageek