AS hasła czynili zarówno upcasts i downcasts:
// Before Swift 1.2
var aView: UIView = someView()
var object = aView as NSObject // upcast
var specificView = aView as UITableView // downcast
The uskok, począwszy od klasy pochodnej do klasy bazowej, mogą być sprawdzane w czasie kompilacji i nigdy nie zawodzą.
Jednak odrzucenia mogą się nie udać, ponieważ nie zawsze można być pewnym danej klasy. Jeśli masz UIView, możliwe, że jest to UITableView lub może UIButton. Jeśli twój downcast idzie do właściwego typu - świetnie! Ale jeśli zdarzy ci się określić niewłaściwy typ, dostaniesz błąd runtime i aplikacja się zawiesi.
W Swift 1.2, downcasts musi być opcjonalny z as? lub "wymuszony failable" z as !. Jeśli masz pewność co do typu, możesz wymusić obsadę jako! podobny do tego, jak byłoby użyć niejawnie-rozpakowany opcjonalnie:
// After Swift 1.2
var aView: UIView = someView()
var tableView = aView as! UITableView
Wykrzyknik sprawia, że absolutnie jasne, że wiesz co robisz i że istnieje szansa, wszystko pójdzie bardzo źle, jeśli już przypadkowo mieszane Twoje typy!
Jak zwykle, jako? z opcjonalnym wiązania jest najbezpieczniejszym sposobem, aby przejść:
// This isn't new to Swift 1.2, but is still the safest way
var aView: UIView = someView()
if let tableView = aView as? UITableView {
// do something with tableView
}
Got to ze strony: SOURCE
Dzięki Jacobson! Jedno dodatkowe pytanie - czasami wpadam w zakłopotanie pomiędzy downcastingiem a wersją Int "konwertującą" do Float. Jeśli masz wartość Integer, ale chcesz przekonwertować na Float, czy został downcast lub konwersji? A co z pływającym o wartości całkowitej? (tj. 2.0) – Alex