我有这个ObjectType类,它是一个帮助我做这样的事情的类:
object.type = ObjectType.TWO
//ObjectType.as
package
{
public class ObjectType
{
public static var ONE:String = "one";
public static var TWO:String = "two";
public static var THREE:String = "three";
public function ObjectType()
{
}
}
}
假设我正在创建一个新类,我需要一个名为type的属性。在该属性集函数中,我想确保它的值是ObjectType变量之一。我怎样才能做到这一点?
public function set type(value:String):void
{
for (var o:Object in ObjectType) {
if (value == o)
this._type = value;
} else {
//error
}
}
}
答案 0 :(得分:6)
无法识别性能,但无需修改任何内容,您可以使用describeType函数检查静态字段并获取值:
function valueInClass(clazz:Class, value:*):Boolean {
return describeType(clazz).variable.(clazz[@name.toString()] == value).length() != 0
}
public function set type(value:String):void
{
if (valueInClass(ObjectType, value)) {
this._type = value;
} else {
//error
}
}
答案 1 :(得分:2)
我想你提出的第二个代码示例不起作用......
我认为这是因为你使用 for 循环有点不对。
for (var blah:String in somewhere){
// blah represents a KEY of the somewhere object
// to get the value of this key, use:
var theValue = somewhere[blah];
}
每个循环的循环遍历值。但是现在我将用于。
此外,它不是in ObjectType
,而是在类'原型中,即in ObjectType.prototype
。
所以,解决这个问题:
for (var o:* in ObjectType.prototype) {
if (value == ObjectType.prototype[o])
this._type = value;
} else {
//error
}
}
答案 2 :(得分:1)
您可以使用反射解决此问题。
几天前问了一个类似的问题,你应该能够使用相同的解决方案,找到here。
答案 3 :(得分:1)
应该注意的是,虽然接受的答案是对的,但它也很慢。不是你想要做的很多事情。有三种更简单的解决方案。
一:检查值本身:
public function set type(value:String):void
{
if( value != ObjectType.ONE && value != ObjectType.TWO && value != ObjectType.THREE )
return;
}
显然,你检查的常数越多,就越难。
二:使用整数作为常量
将ObjectType类更改为使用ints:
public class ObjectType
{
public static var NONE:int = 0;
public static var ONE:int = 1;
public static var TWO:int = 2;
public static var THREE:int = 3;
public static var TOTAL:int = 4;
}
注意那里的NONE
和TOTAL
?这样可以轻松检查您的值是否在正确的范围内:
public function set type(value:int):void
{
if( value <= ObjectType.NONE || value >= ObjectType.TOTAL )
return;
}
您可以根据需要添加更多值,只需更新TOTAL
即可继续使用。这需要每个值都按顺序排列。
三:使用枚举
虽然Flash没有针对枚举的内置类,但是有很多可用的解决方案。查看Scott Bilas的Enum
课程:http://scottbilas.com/blog/ultimate-as3-fake-enums/
使用此作为您的基类,ObjectType
类成为:
public final class ObjectType extends Enum
{
{ initEnum( ObjectType ); } // static ctor
public static const ONE:ObjectType = new ObjectType;
public static const TWO:ObjectType = new ObjectType;
public static const THREE:ObjectType = new ObjectType;
}
现在你的支票变为:
public function set type(value:ObjectType):void
{
...
}
在这里,你的setter现在变得类型安全,并且如果使用ObjectType
以外的任何内容,则会抛出错误。
答案 4 :(得分:0)
事实证明,如果使用ENUM类型的检查,您应检查常量属性,而不是变量,如下例所示: ActionScript - Determine If Value is Class Constant