ActionScript 3
Типы
Поиск…
Литье под давлением
Типовое литье выполняется либо оператором 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
и т. Д.).