Szukaj…


Typ Casting

Rzutowanie typu odbywa się za pomocą operatora as :

var chair:Chair = furniture as Chair;

Lub przez zawinięcie wartości w Type() :

var chair:Chair = Chair(furniture);

Jeśli rzutowanie zakończy się niepowodzeniem as , wynik tego rzutu jest null . Jeśli rzutowanie nie powiedzie się przez zawijanie w Type() , TypeError jest błąd TypeError .

Typ funkcji

Funkcje są typu Function :

function example():void { }
trace(example is Function); // true

Mogą się do nich odwoływać inne zmienne o typie Function :

var ref:Function = example;
ref(); // ref.call(), ref.apply(), etc.

I mogą być przekazywane jako argumenty dla parametrów, których typ to Function :

function test(callback:Function):void {
    callback();
}

test(function() {
    trace('It works!');
}); // Output: It works!

Typ klasy

Odniesienia do deklaracji klas są wpisywane Class :

var spriteClass:Class = Sprite;

Możesz użyć zmiennych typu Class aby utworzyć instancję tej klasy:

var sprite:Sprite = new spriteClass();

Może to być przydatne do przekazania argumentu typu Class do funkcji, która może utworzyć i instancję podanej klasy:

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);

Typy adnotacji

Możesz podać kompilatorowi typ wartości, dodając do niego adnotację :Type :

var value:int = 10; // A property "value" of type "int".

Parametry funkcji i typy zwracane mogą być również opatrzone adnotacjami:

// This function accepts two ints and returns an int.
function sum(a:int, b:int):int {
    return a + b;
}

Próba przypisania wartości z niedopasowania typu będzie skutkować TypeError :

var sprite:Sprite = 10; // 10 is not a Sprite.

Sprawdzanie typów

Za pomocą operatora is można sprawdzić, czy wartość określonego typu:

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.

Istnieje także instanceof operator (przestarzałe), który działa niemal identyczna is poza tym, że zwraca false podczas sprawdzania wdrożonych interfejsów i typów int / uint.

as operator może również stosować tak jak is operator. Jest to szczególnie przydatne, jeśli używasz inteligentnego IDE, takiego jak FlashDevelop, który da ci listę wszystkich możliwych właściwości jawnego typu obiektu. Przykład:

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);
}

Aby uzyskać ten sam efekt, is napisać (nieco mniej wygodne):

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);
}

Pamiętaj tylko, że podczas sprawdzania kodowań as operator, podana wartość zostanie najpierw skonwertowana na określony typ, a następnie wynik tej operacji zostanie sprawdzony, jeśli nie jest fałszywy, więc zachowaj ostrożność, używając jej z możliwymi wartościami false / NaN:

if(false as Boolean) trace("This will not be executed");
if(false as Boolean != null) trace("But this will be");

Poniższa tabela pokazuje podstawowe wartości i typy z wynikami operatorów typów. Zielone komórki będą oceniać na prawdę, czerwone na fałsz, a szarość spowoduje błędy kompilacji / działania.

wprowadź opis zdjęcia tutaj

Wpisane tablice

Niestety w języku ActionScript 3 nie ma pojęcia rodzajowego, dlatego nie można zdefiniować tablicy typowanej jako Array<T> . Istnieje jednak specjalna klasa Vector.<T> która działa w podobny sposób, z tym wyjątkiem, że podczas tworzenia wektora należy podać odwołanie do konkretnej klasy . Oznacza to, że nie ma możliwości budowania abstrakcji na typie Vector.<T> (np. Rozszerzenie i dodanie nowej funkcjonalności), co jest ogromną wadą.

Prostszym sposobem patrzenia jest to, jakby każda zdefiniowana przez ciebie klasa automatycznie miała klasę towarzyszącą o nazwie Vector.<NameOfYourClass> .

To powiedziawszy, nadal istnieją ogromne zalety typu Vector.<T> porównaniu z konwencjonalną tablicą:

  • Podczas pracy z urządzeniem Vector.<T> występuje wzrost wydajności Vector.<T> vs tablice 1 .
  • Otrzymujesz kompilacji typ TypeError ów jeśli próba wstawienia wartości non-T do odbioru.
  • IDE dostarczają użytecznych informacji wskazujących na typ obiektów wewnątrz instancji Vector.<T> .

Przykłady tworzenia Vector.<T> :

var strings:Vector.<String> = new Vector.<String>(); // or
var numbers:Vector.<Number> = new <Number>[];

1 Wektory zapewniają zauważalną poprawę wydajności w porównaniu do tablic podczas pracy z typami pierwotnymi ( String , int , uint , Number itp.).



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow