ActionScript 3
tipi
Ricerca…
Digitare Casting
Il casting del tipo viene eseguito con l'operatore as
:
var chair:Chair = furniture as Chair;
O avvolgendo il valore in Type()
:
var chair:Chair = Chair(furniture);
Se il cast fallisce con as
, il risultato di tale cast è null
. Se il cast fallisce avvolgendo in Type()
, viene lanciato un errore TypeError
.
Il tipo di funzione
Le funzioni sono del tipo Function
:
function example():void { }
trace(example is Function); // true
Possono essere referenziati da altre variabili con il tipo Function
:
var ref:Function = example;
ref(); // ref.call(), ref.apply(), etc.
E possono essere passati come argomenti per parametri il cui tipo è Function
:
function test(callback:Function):void {
callback();
}
test(function() {
trace('It works!');
}); // Output: It works!
Il tipo di classe
I riferimenti alle dichiarazioni di classe sono tipizzati Class
:
var spriteClass:Class = Sprite;
È possibile utilizzare variabili digitate Class
per creare istanze di tale classe:
var sprite:Sprite = new spriteClass();
Questo può essere utile per passare un argomento di tipo Class
a una funzione che potrebbe creare e istanza della classe fornita:
function create(type:Class, x:int, y:int):* {
var thing:* = new type();
thing.x = x;
thing.y = y;
return thing;
}
var sprite:Sprite = create(Sprite, 100, 100);
Tipi di annotazione
Puoi dire al compilatore il tipo di un valore annotandolo con :Type
:
var value:int = 10; // A property "value" of type "int".
I parametri delle funzioni e i tipi di ritorno possono anche essere annotati:
// This function accepts two ints and returns an int.
function sum(a:int, b:int):int {
return a + b;
}
Se si tenta di assegnare un valore con un tipo non corrispondente, verrà TypeError
un TypeError
:
var sprite:Sprite = 10; // 10 is not a Sprite.
Controllo dei tipi
È possibile utilizzare l'operatore is
per verificare se un valore è di un determinato tipo:
var sprite:Sprite = new Sprite();
trace(sprite is Sprite); // true
trace(sprite is DisplayObject); // true, Sprite inherits DisplayObject
trace(sprite is IBitmapDrawable); // true, DisplayObject implements IBitmapDrawable
trace(sprite is Number); // false
trace(sprite is Bitmap); // false, Bitmap inherits DisplayObject
// but is not inherited by Sprite.
C'è anche un instanceof
operatore (sconsigliato), che funziona quasi identica a is
la differenza che restituisce false
quando si controlla per le interfacce implementate e tipi int / uint.
Il as
operatore può anche utilizzato proprio come is
operatore. Ciò è particolarmente utile se si utilizzano IDE intelligenti come FlashDevelop che forniranno un elenco di tutte le proprietà possibili del tipo di oggetto esplicito. Esempio:
for (var i:int = 0; i < a.length; i++){
var d:DisplayObject = a[i] as DisplayObject;
if (!d) continue;
d.//get hints here
stage.addChild(d);
}
Per ottenere lo stesso effetto con is
scrivere (leggermente meno conveniente):
for (var i:int = 0; i < a.length; i++){
if (a[i] is DisplayObject != true) continue;
var d:DisplayObject = a[i] as DisplayObject;
stage.addChild(d);
}
Tieni presente che quando si controllano le codifiche con as
operatore as
, il valore dato verrà convertito in un tipo specificato e il risultato di tale operazione verrà controllato se non falso, quindi fai attenzione quando lo utilizzi con possibili valori falsi / NaN:
if(false as Boolean) trace("This will not be executed");
if(false as Boolean != null) trace("But this will be");
La tabella seguente mostra alcuni valori e tipi di base con il risultato di operatori di tipi. Le celle verdi valuteranno il true, il rosso al false e il greay causeranno errori di compilazione / runtime.
Matrici tipizzate
Sfortunatamente ActionScript 3 non ha un concetto di generici, quindi ne consegue che non esiste un modo per definire un array tipizzato come Array<T>
. Esiste comunque una classe speciale Vector.<T>
che funziona in modo simile, tranne che è necessario fornire un riferimento a una classe concreta durante l'istanziazione del vettore. Ciò significa che non è possibile creare astrazioni sopra il tipo Vector.<T>
(ad esempio estenderlo e aggiungere nuove funzionalità), il che è un enorme inconveniente.
Un modo più semplice di guardare è come se ogni classe definita avesse automaticamente una classe companion chiamata Vector.<NameOfYourClass>
.
Detto questo, ci sono ancora enormi vantaggi per il tipo Vector.<T>
su un array convenzionale:
- C'è un aumento delle prestazioni quando si lavora con
Vector.<T>
vs array 1 . - Riceverai
TypeError
tipo compile se tenti di inserire valori non T nella collezione. - Gli IDE forniscono utili informazioni sull'hint di tipo per gli oggetti all'interno di un'istanza
Vector.<T>
.
Esempi di creazione di un Vector.<T>
:
var strings:Vector.<String> = new Vector.<String>(); // or
var numbers:Vector.<Number> = new <Number>[];
1 I vettori in realtà forniscono miglioramenti delle prestazioni notevoli rispetto agli array quando si utilizzano tipi primitivi ( String
, int
, uint
, Number
, ecc.).