as
Wird für Upcasting und Typguss auf überbrückten Typ verwendet
as?
Wird für sicheres Gießen verwendet. Wenn dies fehlschlägt, wird Null zurückgegeben
as!
wird verwendet, um das Casting zu erzwingen, stürzt ab, wenn dies fehlschlägt
Hinweis:
as!
Der Rohtyp kann nicht in optional umgewandelt werden
Beispiele:
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?)
Beispiel
var age: Int? = nil
var height: Int? = 180
Durch Hinzufügen eines ? Unmittelbar nach dem Datentyp teilen Sie dem Compiler mit, dass die Variable möglicherweise eine Zahl enthält oder nicht. Ordentlich! Beachten Sie, dass es nicht wirklich sinnvoll ist, optionale Konstanten zu definieren. Sie können ihren Wert nur einmal festlegen und können daher sagen, ob ihr Wert Null ist oder nicht.
Wann sollten wir "?" und wann "!"
Nehmen wir an, wir haben eine UIKit-basierte einfache App. Wir haben Code in unserem View Controller und möchten einen neuen View Controller darüber präsentieren. und wir müssen uns entscheiden, die neue Ansicht mit dem Navigationscontroller auf dem Bildschirm anzuzeigen.
Wie wir wissen, verfügt jede ViewController-Instanz über einen Eigenschaftsnavigationscontroller. Wenn Sie eine auf Navigationscontrollern basierende App erstellen, wird diese Eigenschaft des Master View Controllers Ihrer App automatisch festgelegt und Sie können sie zum Push- oder Popup von View Controllern verwenden. Wenn Sie eine einzelne App-Projektvorlage verwenden, wird kein Navigations-Controller automatisch für Sie erstellt, sodass im Standard-Ansichts-Controller Ihrer App nichts in der Eigenschaft navigationController gespeichert ist.
Ich bin sicher, Sie haben bereits vermutet, dass dies genau der Fall für einen optionalen Datentyp ist. Wenn Sie UIViewController aktivieren, sehen Sie, dass die Eigenschaft wie folgt definiert ist:
var navigationController: UINavigationController? { get }
Kehren wir also zu unserem Anwendungsfall zurück. Wenn Sie sicher sind, dass Ihr View Controller immer über einen Navigationscontroller verfügt, können Sie das Entpacken erzwingen:
controller.navigationController!.pushViewController(myViewController, animated: true)
Wenn Sie eine setzen! Hinter dem Eigenschaftsnamen teilen Sie dem Compiler mit, dass es mir egal ist, dass diese Eigenschaft optional ist. Ich weiß, dass bei der Ausführung dieses Codes immer ein Wertspeicher vorhanden ist. Behandeln Sie diese Option daher wie einen normalen Datentyp. Na ist das nicht schön Was würde jedoch passieren, wenn Ihr Ansichtscontroller keinen Navigationscontroller enthält? Wenn Sie vorschlagen, dass immer ein Wert in navigationController gespeichert wird, war das falsch? Ihre App wird abstürzen. So einfach und hässlich.
Also, benutze! Nur wenn Sie zu 101% sicher sind, dass dies sicher ist.
Wie wäre es, wenn Sie nicht sicher sind, ob es immer einen Navigationscontroller geben wird? Dann können Sie verwenden? anstelle einer !:
controller.navigationController?.pushViewController(myViewController, animated: true)
Was zum ? Hinter dem Eigenschaftsnamen steht, dass der Compiler weiß, ob diese Eigenschaft nil oder einen Wert enthält. Wenn sie also einen Wert hat, verwenden Sie ihn und betrachten Sie im Übrigen einfach den gesamten Ausdruck nil. Effektiv die? Mit dieser Eigenschaft können Sie diese Eigenschaft nur für den Fall verwenden, dass ein Navigationscontroller vorhanden ist. Nein, wenn Schecks jeglicher Art oder Gussteile jeglicher Art. Diese Syntax ist perfekt, wenn Sie sich nicht darum kümmern, ob Sie einen Navigationscontroller haben oder nicht, und nur dann etwas tun möchten, wenn es einen gibt.
Vielen Dank an Fantageek