ActionScript - определите, является ли значение константой класса - PullRequest
3 голосов
/ 11 марта 2011

Я хотел бы выдать ошибку аргумента, если конкретная функция не работает без переданного значения, которое также является публичной константой класса, содержащего функцию.

Есть ли способ определить, владеет ли класс общедоступной константой, вместо того, чтобы выполнять итерации по всем из них?

как то так:

public static const HALIFAX:String = "halifax";
public static const MONTREAL:String = "montreal";
public static const TORONTO:String = "toronto";

private var cityProperty:String;

public function set city(value:String):void
     {
     if (!this.hasConstant(value))
        throw new ArgumentError("set city value is not applicable.");

     cityProperty = value;
     }

public function get city():Strig
     {
     return cityProperty;
     }

В настоящее время для этой функции я должен написать функцию установки города следующим образом:

public function set city(value:String):void
     {
     if (value != HALIFAX && value != MONTREAL && value != TORONTO)
        throw new ArgumentError("set city value is not applicable.");

     cityProperty = value;
     }

это единственный способ выполнить эту задачу?

Ответы [ 3 ]

7 голосов
/ 11 марта 2011

Да, если вы используете отражения:

private var type:Class;
private var description:XML;

private function hasConstant (str : String ) : Boolean 
{
    if (description == null) 
    {
        type = getDefinitionByName (getQualifiedClassName (this)) as Class;
        description = describeType (type);      
    }
    for each ( var constant:XML in description.constant) 
    {
        if (type[constant.@name] == str) return true;
    }
    return false;
}

Обратите внимание, что для этого все константы всегда должны быть объектами String, объявленными public static const.

3 голосов
/ 10 апреля 2012

Я сам искал ответ на этот вопрос и нашел раздражающим, что hasOwnProperty() не работает для статических свойств. Однако оказывается, что если вы приведете свой класс к объекту Class, он сработает.

Вот пример:

public final class DisplayMode
{
  public static const one:   String = "one";
  public static const two:   String = "two";
  public static const three: String = "three";

  public static function isValid(aDisplayMode: String): Boolean {
    return Class(DisplayMode).hasOwnProperty(aDisplayMode);
  }
}

Я обязан этим решением jimmy5804 из этой дискуссии , поэтому снимаю шляпу перед ним.

0 голосов
/ 11 марта 2011

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

var foo:Sprite = new Sprite();
foo.rotation = 20;
trace( foo["x"], foo["rotation"]); // traces "0 20"

или более конкретно для вашего случая:

var bar:String = "rotation";
trace( foo[bar] ); // traces "20"

Единственное, на что вам следует обратить внимание, это то, что средство доступа к скобкам выдаст ReferenceError, если вызапросить свойство объекта, которого там нет, например:

trace ( foo["cat"] ); // throws ReferenceError

Но оно не выдаст, если вы запрашиваете статическое свойство:

trace ( Sprite["cat"] ); // traces "undefined"

Так что в вашем случаеВы можете попробовать:

if ( this[value] == undefined ) {
    throw new ArgumentError("set city value is not applicable.");
}

РЕДАКТИРОВАТЬ: Извините, я путал имена const с их значениями.

Чтобы это работало над вашей проблемой, вам нужно сделать строкузначение равно имени const, например:

public static const HALIFAX:String = "HALIFAX";

, тогда вы можете использовать запрос, как описано выше, и он даст вам желаемый результат.

...