Поиск…


Литье под давлением

Типовое литье выполняется либо оператором as :

var chair:Chair = furniture as Chair;

Или, обернув значение в Type() :

var chair:Chair = Chair(furniture);

Если бросок терпит неудачу с , as результат этого броска null . Если сбой завершается путем переноса в Type() , TypeError .

Тип функции

Функции имеют тип Function :

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

На них могут ссылаться другие переменные с типом Function :

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

И они могут быть переданы как аргументы для параметров, тип которых - Function :

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

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

Тип класса

Написаны ссылки на объявления Class :

var spriteClass:Class = Sprite;

Вы можете использовать переменные типизированного Class для создания экземпляров этого класса:

var sprite:Sprite = new spriteClass();

Это может быть полезно для передачи аргумента типа Class функции, которая может создать и экземпляр предоставленного класса:

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

Аннотирующие типы

Вы можете указать компилятору тип значения, аннотируя его с помощью :Type :

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

Функциональные параметры и типы возврата также могут быть аннотированы:

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

Попытка присвоить значение с несоответствующим типом приведет к типу TypeError :

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

Проверка типов

Вы можете использовать оператор is для проверки того, имеет ли значение определенный тип:

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.

Существует также instanceof оператор (устаревшее) , который работает почти идентично is исключением того, что она возвращает false при проверке реализованных интерфейсов и типов INT / UINT.

, as оператор может также использоваться так же , как is оператор. Это особенно полезно, если вы используете некоторую интеллектуальную среду IDE, такую ​​как FlashDevelop, которая предоставит вам список всех возможных свойств явного типа объекта. Пример:

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

Для того, чтобы получить тот же эффект с is можно было бы написать (sligthly менее удобно):

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

Просто имейте в виду , что при проверке coditions с as оператора, данное значение будет преобразовано в кулак указанного типа , а затем в результате этой операции будет проверяться , если не ложь, так что будьте осторожны при использовании его с возможными значениями ложных / NaN:

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

Ниже таблицы показаны некоторые базовые значения и типы с результатом операторов типа. Зеленые ячейки будут оценивать значение true, красный - false, а greay вызовет ошибки компиляции / времени выполнения.

введите описание изображения здесь

Типизированные массивы

К сожалению, ActionScript 3 не имеет понятия generics, поэтому следует, что нет способа определить типизированный массив как Array<T> . Однако существует специальный класс Vector.<T> который работает аналогичным образом, за исключением того, что вы должны указывать конкретный класс при создании экземпляра вектора. Это означает, что нет возможности создавать абстракции поверх типа Vector.<T> (например, расширять его и добавлять новые функции), что является огромным недостатком.

Более простой способ взглянуть на это состоит в том, что каждый класс, который вы определяете автоматически, имел сопутствующий класс с именем Vector.<NameOfYourClass> .

С учетом сказанного, все еще существуют огромные преимущества для типа Vector.<T> для обычного массива:

  • Увеличивается производительность при работе с Vector.<T> vs массивы 1 .
  • Вы получаете тип TypeError типа компиляции, если вы пытаетесь вставить значения non-T в коллекцию.
  • IDE предоставляют полезную информацию о подсказке типа для объектов внутри экземпляра Vector.<T> .

Примеры создания Vector.<T> :

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

1 Векторы фактически обеспечивают заметные улучшения производительности по сравнению с массивами при работе с примитивными типами ( String , int , uint , Number и т. Д.).



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow