Flash CS3-Dokumentation |
|||
| Programmieren mit ActionScript 3.0 > ActionScript-Sprache und -Syntax > Datentypen > Typumwandlungen | |||
Eine Typumwandlung tritt auf, wenn ein Wert in den Wert eines anderen Datentyps umgewandelt wird. Typumwandlungen können entweder implizit oder explizit erfolgen. Eine implizite Umwandlung (auch als Coercion bezeichnet) wird manchmal zur Laufzeit von Flash Player durchgeführt. Angenommen, einer Variablen des Datentyps „Boolean" wird der Wert 2 zugeordnet, so wandelt Flash Player den Wert 2 in den booleschen Wert true um, bevor er der Variablen zugewiesen wird. Eine explizite Umwandlung (auch als Casting bezeichnet) tritt auf, wenn der Compiler im Code angewiesen wird, eine Variable eines Datentyps so zu behandeln, als gehöre sie zu einem anderen Datentyp. Sind auch Grundwerte involviert, wandelt Casting die Werte von einem Datentyp in den anderen um. Um ein Objekt in einen anderen Typ umzuwandeln, schließen Sie den Objektnamen in runde Klammern ein und stellen ihm den Namen des neuen Typs voran. Im folgenden Codebeispiel wird ein boolescher Wert in eine Ganzzahl umgewandelt:
var myBoolean:Boolean = true; var myINT:int = int(myBoolean); trace(myINT); // 1
Implizite Umwandlungen treten zur Laufzeit in verschiedenen Kontexten auf:
+)Implizite Umwandlungen von benutzerdefinierten Typen sind dann erfolgreich, wenn der umzuwandelnde Wert eine Instanz der Zielklasse oder eine von der Zielklasse abgeleitete Klasse ist. Ist eine implizite Umwandlung nicht erfolgreich, tritt ein Fehler auf. Der folgende Code enthält beispielsweise eine erfolgreiche implizite Umwandlung und eine nicht erfolgreiche implizite Umwandlung:
class A {}
class B extends A {}
var objA:A = new A();
var objB:B = new B();
var arr:Array = new Array();
objA = objB; // Umwandlung erfolgreich.
objB = arr; // Umwandlung nicht erfolgreich.
Bei Grundtypen werden implizite Umwandlungen durch Aufrufen der gleichen internen Umwandlungsalgorithmen bearbeitet, die auch für explizite Umwandlungen verwendet werden. In den folgenden Abschnitten wird die Umwandlung dieser Grundtypen ausführlich beschrieben.
Beim Kompilieren im strikten Modus sollten Sie explizite Umwandlungen (Casting) verwenden, da u. U. verhindert werden soll, dass eine Typdiskrepanz einen Kompilierungsfehler erzeugt. Dies ist z. B. der Fall, wenn Sie wissen, dass die Coercion Ihre Werte zur Laufzeit korrekt umwandelt. Wenn Sie beispielsweise mit Daten arbeiten, die von einem Formular übergeben werden, soll die Umwandlung von bestimmten Stringwerten zu numerischen Werten von der Coercion ausgeführt werden. Mit dem folgenden Code wird ein Kompilierungsfehler erzeugt, obwohl er im Standardmodus fehlerfrei ausführbar wäre:
var quantityField:String = "3"; var quantity:int = quantityField; // Compiler-Fehler im strikten Modus
Wenn Sie weiterhin den strikten Modus verwenden, den String aber in eine Ganzzahl umwandeln möchten, können Sie die explizite Umwandlung verwenden. Dazu verwenden Sie folgenden Code:
var quantityField:String = "3"; var quantity:int = int(quantityField); // Explizite Umwandlung erfolgreich.
Sie können jeden Datentyp in einen der drei Datentypen für Zahlen umwandeln: „int", „uint" und „Number". Kann Flash Player die Zahl nicht umwandeln, wird der Standardwert „0" für die Datentypen „int" und „uint" und der Standardwert NaN für den Datentyp „Number" zugewiesen. Wenn Sie einen booleschen Wert in eine Zahl umwandeln, wird true in den Wert „1" und false in den Wert „0" konvertiert.
var myBoolean:Boolean = true; var myUINT:uint = uint(myBoolean); var myINT:int = int(myBoolean); var myNum:Number = Number(myBoolean); trace(myUINT, myINT, myNum); // 1 1 1 myBoolean = false; myUINT = uint(myBoolean); myINT = int(myBoolean); myNum = Number(myBoolean); trace(myUINT, myINT, myNum); // 0 0 0
Stringwerte, die nur Ziffern enthalten, können in einen der anderen Datentypen für Zahlen umgewandelt werden. Die Datentypen für Zahlen können auch Strings umwandeln, die wie negative Zahlen aussehen oder einen Hexadezimalwert darstellen (z. B. 0x1A). Beim Umwandlungsprozess werden vor- und nachgestellte Leerzeichen in Stringwerten ignoriert. Mit Number() können Sie auch Strings umwandeln, die Textdarstellungen von Gleitkommazahlen sind. Beim Einfügen eines Dezimalzeichens wird mit uint() und int() eine Ganzzahl zurückgegeben, bei der die Ziffern und Zeichen hinter der Dezimalstelle abgeschnitten sind. Die folgenden Stringwerte können beispielsweise in Zahlen umgewandelt werden:
trace(uint("5")); // 5
trace(uint("-5")); // 4294967291. Da uint keine negativen Zahlen kennt, entspricht -1 dem Wert MAX_VALUE usw.
trace(uint(" 27 ")); // 27
trace(uint("3.7")); // 3
trace(int("3.7")); // 3
trace(int("0x1A")); // 26
trace(Number("3.7")); // 3.7
Stringwerte, die keine numerischen Zeichen enthalten, geben „0" zurück, wenn sie mit int() oder uint() umgewandelt werden, und NaN, wenn die Umwandlung mit Number() erfolgt. Der Umwandlungsprozess ignoriert vor- und nachgestellte Leerzeichen, gibt aber 0 oder NaN zurück, wenn die Zeichenfolge Leerstellen enthält, die zwei Zahlen voneinander trennen.
trace(uint("5a")); // 0
trace(uint("ten")); // 0
trace(uint("17 63")); // 0
In ActionScript 3.0 unterstützt die Number()-Funktion keine Oktal- oder Basis 8-Zahlen. Wenn Sie in ActionScript 2.0 eine Zeichenfolge mit einer vorgestellten Null an die Number()-Funktion übergeben, wird die Zahl als Oktalzahl interpretiert und in den entsprechenden Dezimalwert umgewandelt. Dies ist in ActionScript 3.0 bei der Number()-Funktion nicht der Fall. Hier wird die vorgestellte Null stattdessen ignoriert. Mit dem folgenden Code wird beispielsweise je nach verwendeter ActionScript-Version eine andere Ausgabe erzeugt:
trace(Number("044"));
// ActionScript 3.0 44
// ActionScript 2.0 36
Eine Typumwandlung (Casting) ist nicht erforderlich, wenn ein Wert eines numerischen Typs einer Variablen eines anderen numerischen Typs zugewiesen wird. Auch im strikten Modus werden numerische Datentypen implizit in andere numerische Datentypen umgewandelt. Dies führt in einigen Fällen dazu, dass sich unerwartete Werte einstellen, wenn der Bereich eines Datentyps überschritten wird. Die folgenden Beispiele werden alle im strikten Modus kompiliert, obwohl einige unerwartete Werte erzeugen werden:
var myUInt:uint = -3; // Einen Wert des Datentyps int/Number einer uint-Variablen zuweisen trace(myUInt); // 4294967293 var myNum:Number = sampleUINT; // Einen Wert des Datentyps int/uint einer Number-Variablen zuweisen trace(myNum) // 4294967293 var myInt:int = uint.MAX_VALUE + 1; // Einen Wert des Datentyps Number einer uint-Variablen zuweisen trace(myInt); // 0 myInt = int.MAX_VALUE + 1; // Einen Wert des Datentyps uint/Number einer int-Variablen zuweisen trace(myInt); // -2147483648
In der folgenden Tabelle sind die Ergebnisse der Umwandlung von Datentypen in den Datentyp „Number", „int" oder „uint" aufgeführt.
|
Datentyp oder Wert |
Ergebnis der Umwandlung in „Number", „int" oder „uint" |
|---|---|
|
Boolean |
Wenn der Wert |
|
Date |
Die interne Darstellung des Date-Objekts gibt die Anzahl der Millisekunden an, die seit dem 1. Januar 1970, 0.00 Uhr Weltzeit verstrichen sind. |
null
|
0 |
|
Object |
Wenn die Instanz |
|
String |
Eine Zahl, wenn Flash Player den String in eine Zahl umwandeln kann. |
|
|
Wenn in den Datentyp „Number" umgewandelt |
Durch die Umwandlung eines beliebigen numerischen Datentyps („uint", „int" und „Number") in den Datentyp „Boolean" wird false zurückgegeben, wenn der numerische Wert 0 lautet, andernfalls true. Beim Datentyp „Number" gibt der Wert NaN ebenfalls false zurück. Im folgenden Beispiel sind die Ergebnisse der Umwandlung der Zahlen -1, 0 und 1 dargestellt:
var myNum:Number;
for (myNum = -1; myNum<2; myNum++)
{
trace("Boolean(" + myNum +") is " + Boolean(myNum));
}
Im folgenden Beispiel wird veranschaulicht, dass nur eine der drei Zahlen (0) den Wert false zurückgibt:
Boolean(-1) is true Boolean(0) is false Boolean(1) is true
Beim Umwandeln eines Stringwerts in einen booleschen Wert wird false zurückgegeben, wenn der String null lautet oder es sich um einen leeren String ("") handelt. Andernfalls wird true zurückgegeben.
var str1:String; // Ein nicht initialisierter String ist "null". trace(Boolean(str1)); // false var str2:String = ""; // leerer String trace(Boolean(str2)); // false var str3:String = " "; // nur Leerraum trace(Boolean(str3)); // true
Bei der Umwandlung der Instanz einer Object-Klasse in den Datentyp „Boolean" wird false zurückgegeben, wenn die Instanz null lautet, andernfalls true:
var myObj:Object; // Ein nicht initialisiertes Objekt ist "null". trace(Boolean(myObj)); // false myObj = new Object(); // instanziieren trace(Boolean(myObj)); // true
Variable des Typs „Boolean" erfahren im strikten Modus eine Sonderbehandlung. Das heißt, Sie können einer booleschen Variablen ohne Umwandlung (Casting) Werte jedes Datentyps zuweisen. Die implizite Coercion aus allen Datentypen in den Datentyp „Boolean" tritt sogar im strikten Modus auf. Anders ausgedrückt, im Gegensatz zu fast allen anderen Datentypen ist eine Umwandlung in den Datentyp „Boolean" nicht erforderlich, um Fehler im strikten Modus zu vermeiden. Die folgenden Beispiele werden alle im strikten Modus kompiliert und verhalten sich zur Laufzeit wie erwartet:
var myObj:Object = new Object(); // instanziieren var bool:Boolean = myObj; trace(bool); // true bool = "random string"; trace(bool); // true bool = new Array(); trace(bool); // true bool = NaN; trace(bool); // false
In der folgenden Tabelle sind die Ergebnisse der Umwandlung eines anderen Datentyps in den Datentyp „Boolean" aufgeführt:
|
Datentyp oder Wert |
Ergebnis der Umwandlung in den Datentyp „Boolean". |
|---|---|
|
String |
|
null
|
false
|
|
Number, int oder uint |
|
|
Object |
|
Durch die Umwandlung eines beliebigen numerischen Datentyps in den Datentyp „String" wird eine Stringdarstellung der Zahl zurückgegeben. Die Umwandlung eines booleschen Werts in den Datentyp „String" gibt den String „true" zurück, wenn der Wert true lautet, oder den String „false", wenn der Wert false lautet.
Die Umwandlung einer Instanz der Object-Klasse in den Datentyp „String" gibt den String „null" zurück, wenn die Instanz null lautet. Andernfalls gibt die Umwandlung einer Object-Klasse in den Datentyp „String" den String „[object Object]" zurück.
Die Umwandlung einer Array-Klasse in den Datentyp „String" gibt einen String zurück, der aus einer kommagetrennten Liste aller Array-Elemente besteht. Beispielsweise gibt die folgende Umwandlung in den Datentyp „String" einen String zurück, der alle drei Elemente des folgenden Arrays enthält:
var myArray:Array = ["primary", "secondary", "tertiary"]; trace(String(myArray)); // primary,secondary,tertiary
Die Umwandlung einer Instanz der Date-Klasse in den Datentyp „String" gibt eine Stringdarstellung des Datums zurück, das die Instanz enthält. Im folgenden Code wird eine Stringdarstellung der Date-Klasseninstanz zurückgegeben (die Ausgabe zeigt das Ergebnis für die Pacific Daylight Time):
var myDate:Date = new Date(2005,6,1); trace(String(myDate)); // Fri Jul 1 00:00:00 GMT-0700 2005
In der folgenden Tabelle sind die Ergebnisse der Umwandlung eines anderen Datentyps in den Datentyp „String" aufgeführt:
|
Datentyp oder Wert |
Ergebnis der Umwandlung in den Datentyp „String" |
|---|---|
|
Array |
Ein String, die alle Array-Elemente enthält. |
|
Boolean |
|
|
Date |
Die Stringdarstellung des Date-Objekts. |
null
|
"null"
|
|
Number, int oder uint |
Die Stringdarstellung der Zahl. |
|
Object |
Wenn die Instanz „null" ist, |
Flash CS3
Eine E-Mail an mich senden, wenn dieser Seite Kommentare hinzugefügt werden | Kommentarbericht
Aktuelle Seite: http://livedocs.adobe.com/flash/9.0_de/main/00000048.html