[Swift] Ich habe bereits viele Informationen, aber ich habe versucht, die Besetzung (as, as !, As?) Auf meine eigene Weise zusammenzufassen.

Was ist eine Typbesetzung?

** Cast ** bezieht sich auf die Behandlung von Variablen und Konstanten als spezifischere und universellere Typen. Zum Beispiel bedeutet dies, eine Variable, die "Beliebiger Typ" war, als "Zeichenfolgentyp" zu behandeln und umgekehrt "Zeichenfolgentyp" als "Beliebiger Typ" zu behandeln.

Gussart

Es gibt zwei Arten von Besetzungen: "Upcast" und "Downcast". Der Unterschied zwischen Upcast und Downcast besteht darin, ob es sich um einen allgemeineren Typ oder einen konkreten Typ handelt.

Was ist ausgestoßen?

Verwenden Sie "Upcast", um es als allgemeineren Wert zu behandeln (größere Gruppe).

Verwenden Sie "as", wenn Sie mit Upcasts arbeiten. Jetzt schreiben wir den Code.

.swift


let string: String = "sample" //Zeichenfolgentyp
let any: Any = string as Any  //Upcast vom String-Typ zum Any-Typ

Auf diese Weise ** Wert, den Sie als Typ ** hochladen möchten Sie können durch Schreiben im Format upcasten.

Was ist niedergeschlagen

"Niedergeschlagen" bezieht sich auf die Behandlung als einen spezifischeren Typ. Dies ist bei Downcasts nicht immer der Fall. Beinhaltet die Möglichkeit eines Ausfalls. Lassen Sie uns verstehen, dass die Grammatik auch eine Voraussetzung ist, einschließlich des Scheiterns.

Es gibt zwei Möglichkeiten, einen Downcast mit "als? Oder als!" Zu schreiben.

Niedergeschlagen mit als?

Jetzt schreiben wir den Code. Die Art und Weise, mit as? Zu schreiben, ist wie folgt.

.swift


let any: Any = "sample" as Any
let string = any as? String //Optional("sample")
let int = any as? Int //nil

Versuche, in Zeile 3 des obigen Beispiels auf den Int-Typ herunterzuspielen, schlagen jedoch fehl, da "sample" kein Int-Typ sein kann. In diesem Fall ist der Wert Null.

Das Merkmal von as? Ist das, dass es Null wird, wenn es auf diese Weise versagt? Wenn Sie sich die zweite Zeile ansehen, ist dies ein erfolgreicher Downcast auf den String-Typ, aber der Wert ist ein optionaler Typ vom String-Typ. Dies kann fehlschlagen, daher ist das Ergebnis optional. (Optionaler Typ bedeutet, dass Null auf den Punkt gebracht wird.)

Downcasting mit as? Auf diese Weise wird null angezeigt, wenn das Ergebnis optional ist und fehlschlägt.

Niedergeschlagene Zusammenfassung mit als?

① Das Ergebnis ist ein optionaler Typ
② Wenn dies fehlschlägt, ist das Ergebnis gleich Null.

Niedergeschlagen mit als!

Der Downcast mit as! Wird wie folgt geschrieben.

.swift


let any: Any = "sample" as Any
let string = any as! String //"sample"
let int = any as! Int //Laufzeit Fehler

Die Schreibmethode selbst unterscheidet sich nicht so sehr von der von?, Aber das Ergebnis ist anders.

Wenn die zweite Zeile wie? Ist, ist der optionale Typ jetzt der String-Typ. Außerdem tritt in der dritten Zeile ein Laufzeitfehler auf.

Für diejenigen, die den optionalen Typ kennen, wurde er möglicherweise grob in Betracht gezogen, aber bei Verwendung von as! Wird das Ergebnis zur Laufzeit zwangsweise entpackt und statt des Ergebnisses nicht zum optionalen Typ, wenn es fehlschlägt. Ein Fehler wird auftreten und die App wird abstürzen. ** Downcasting mit as! Wird als Zwangsguss bezeichnet. ** ** **

Niedergeschlagene Zusammenfassung mit als?

① Das Ergebnis ist nicht optional
(2) Wenn dies fehlschlägt, tritt ein Laufzeitfehler auf.

Soll ich als verwenden? Oder als!

Ich habe eine Downcast-Methode mit "as?" Und "as!"

Anstatt sicher zu sein, müssen Sie schreiben, was zu tun ist, wenn es fehlschlägt. Andererseits riskiert as! Zur Laufzeit einen Fehler, anstatt schreiben zu müssen, was zu tun ist, wenn er fehlschlägt.

Man kann sagen, dass beide Vor- und Nachteile haben, aber ich persönlich denke, es ist besser, als? Zu verwenden, was grundsätzlich sicher ist.

Als gefährliches Muster habe ich versucht, "[Fix]" zu drücken, und es wurde gelöst, also ist es okay! Es ist ein Muster, das bei der Ausführung einen Laufzeitfehler verursacht. Wenn Sie so weit gelesen haben, werden Sie wahrscheinlich verstehen, warum es nicht gut ist, aber beachten Sie, dass die Verwendung von as! Auf diese Weise zu instabilem Code führt.

Zusammenfassung

Ich möchte die Artikel vorstellen, auf die ich mich bei der Veröffentlichung dieses Artikels bezogen habe. https://fukatsu.tech/swift-cast

Dieses Mal habe ich über "Typ Cast" zusammengefasst. Typografie ist ein grundlegender Bestandteil von Swift, aber ich denke, es ist notwendig, sie klar zu verstehen, da es leicht zu unerwarteten Fehlern kommt, wenn Sie damit umgehen, ohne sie zu verstehen, oder vorerst in den Zustand der Beschreibung zu geraten.

Um mein eigenes Lernen zu vertiefen, habe ich es dieses Mal organisiert und veröffentlicht, während ich mich auf andere Artikel bezog. Bitte nehmen Sie Bezug darauf!

Recommended Posts

[Swift] Ich habe bereits viele Informationen, aber ich habe versucht, die Besetzung (as, as !, As?) Auf meine eigene Weise zusammenzufassen.
Ich habe versucht, die Objektorientierung auf meine Weise zusammenzufassen.
Ein Super-Anfänger hat das Frühlings-Einführungsbuch fertiggestellt, daher werde ich es auf meine eigene Weise zusammenfassen
Ich habe versucht, die Grundlagen von Kotlin und Java zusammenzufassen
Ich habe die grundlegende Grammatik von Ruby kurz zusammengefasst
Ich habe einen RESAS-API-Client in Java erstellt
Als ich zu IntelliJ wechselte, gab es einen großen Unterschied in der Codierung der Eigenschaftendatei.
[Für Swift-Anfänger] Ich habe versucht, den chaotischen Layoutzyklus von ViewController und View zusammenzufassen
Ich habe versucht, den Weihnachtsbaum in einem Lebensspiel zu beleuchten
Ich habe versucht, die Methoden von Java String und StringBuilder zusammenzufassen
Ich habe versucht, ein Beispielprogramm mit dem Problem des Datenbankspezialisten für domänengesteuertes Design zu erstellen
Ich habe versucht, ein übergeordnetes Wertklasseobjekt in Ruby zu erstellen
Ich habe versucht, die wichtigsten Punkte des gRPC-Designs und der Entwicklung zusammenzufassen
Ich habe versucht, den CPU-Kern mit Ruby voll auszunutzen
[Ruby] Ich habe versucht, die häufigen Methoden in Paiza zusammenzufassen
[Ruby] Ich habe versucht, die häufigen Methoden mit paiza ② zusammenzufassen
Ich habe versucht, die verwendeten Methoden zusammenzufassen
Ich habe versucht, die Stream-API zusammenzufassen
Da der Unit-Test des PJ, für den ich verantwortlich war, ein Höllenbild war, werde ich meinen eigenen Leitfaden veröffentlichen (?)
Was ich versucht habe, als ich alle Felder einer Bohne bekommen wollte
So erhalten Sie die ID eines Benutzers, der sich in Swift bei Firebase authentifiziert hat
Ich habe versucht, die Sitzung in Rails zu organisieren
Ich möchte die MD5-Prüfsumme einer Datei in Java finden und das Ergebnis als Zeichenfolge in hexadezimaler Notation erhalten.
[Rails] Ich möchte das Linkziel von link_to auf einer separaten Registerkarte anzeigen
05. Ich habe versucht, die Quelle von Spring Boot zu löschen
Ich habe versucht, die Kapazität von Spring Boot zu reduzieren
Ich habe versucht, eine Clova-Fähigkeit in Java zu erstellen
Ich habe versucht, eine Anmeldefunktion mit Java zu erstellen
Ich habe versucht, die Methode der gegenseitigen Teilung von Eugrid in Java zu implementieren
Ich habe mir die Rosen von Versailles angesehen und versucht, das Schlusslied in Java zu reproduzieren
Ich habe versucht, die Beispielanwendung gemäß der Idee des Buches "Micro Service Architecture" in einen Mikrodienst zu verwandeln.
[Rails 6.0, Docker] Ich habe versucht, die Konstruktion der Docker-Umgebung und die zum Erstellen eines Portfolios erforderlichen Befehle zusammenzufassen
Ich habe versucht, die Cache-Funktion von Application Container Cloud Service in der lokalen Umgebung zu entwickeln
Eine Geschichte, die mir klar wurde, dass ich überhaupt als Ingenieur studieren musste
Ich habe versucht, das GitHub-Repository als Bibliotheksserver zu verwenden
Port C-Code mit vielen Typecasts zu Swift
Ich habe JAX-RS ausprobiert und mir das Verfahren notiert
So erhalten Sie die längsten Informationen von Twitter ab dem 12.12.2016
Ich habe versucht, in Java von einer Zeichenfolge in einen LocalDate-Typ zu konvertieren
Ich habe versucht, eine Umgebung mit WSL2 + Docker + VSCode zu erstellen
Ich habe versucht, eine Webanwendung voller Fehler mit Kotlin zu implementieren
Ich habe versucht, eine Validierung durchzuführen, um zu vereinheitlichen, wie Hash-Tags geschrieben werden
[Controller] Ich möchte den numerischen Wert einer bestimmten Spalte aus der Datenbank abrufen (mein Memo).
Ich habe versucht, die Ergebnisse vor und nach der Date-Klasse mit einer geraden Zahl auszudrücken
Ich habe eine App für maschinelles Lernen mit Dash (+ Docker) Teil 2 ~ Grundlegende Schreibweise für Dash ~ erstellt
Als ich versuchte, meinen eigenen Dienst auszuführen, schlug dies fehl und ich schraubte ihn in den Taskplaner