2013-07-22 2 views
1

사용자 지정 클래스의 속성을 반복 할 때 methods provided by Adobe이 작동하지 않는 것처럼 보입니다. 컴파일 또는 런타임 오류가 발생하지 않습니다.클래스 속성 열거

클래스

package { 
    public dynamic class enum { 
     public var foo:Number = 123; 

     public function enum() { 
      this.setPropertyIsEnumerable("foo", true); 
      if (this.propertyIsEnumerable("foo") == false) { 
       trace("foo:" + foo + " is not enumerable.") 
      } 
     } 
    } 
} 

// outputs "foo:bar is not enumerable." 

Implementaiton 나는 그냥 할 수 있도록 동적으로 클래스를 변경해야 할 때 정말 실망 그래서, 빠르고 유연한 내 코드를 유지하려고

var test:enum = new enum(); 
for (var property:String in test) { 
    trace(property); 
} 

// outputs nothing 

속성에 for ... in을 사용합니다. Jackson Dunstan's testing confirms that this can be 400x slower than static class properties이지만 명시 적으로 참조해야하며 (속성에 무관 한 방법에는 비실용적 임) 액세스가 가능하려면 클래스의 반영을 사용해야합니다.

전체 문제를 회피하는 유일한 방법은 동적으로 선언 된 변수를 사용하는 것입니다. 그 시점에서 setPropertyIsEnumerable (prop, true)를 사용하면 무의미한 것이므로 불필요합니다. 동적으로 생성 된 모든 속성 은 이미 열거 형입니다. 또한 동적 변수를 강하게 데이터 형식으로 지정할 수 없으며 성능이 창 밖으로 나옵니다. 예를 들어

...

클래스

package { 
    public dynamic class enum { 
     public var foo:String = "apple"; 

     public function enum(){ 
      this.dynamicVar = "orange"; 
      this.dynamicProp = "banana"; 
      this.setPropertyIsEnumerable("foo", true); 
      this.setPropertyIsEnumerable("dynamicProp", false); 
     } 
    } 
} 

구현

var test:enum = new enum(); 
for (var key:String in test) { 
    trace(key + ": " + test[key]); // dynamicVar: 1 
} 

// outputs "dynamicVar: orange" 

지금 클래스가 동적 인 것을, 우리가 볼 우리의 3 개 테스트 속성의 하나 반복되고있다. 2가 있어야합니다.

Adobe는 나쁜 프로그래밍 습관을 채택하기를 원합니다. 단어가 실패 ...

답변

1

비 동적 클래스는 열거 가능한 속성이나 메서드를 제공하지 않습니다.

제공된 링크의 설명에 명시된 바와 같습니다. Sets the availability of a dynamic property for loop operations.

난 당신이 방법에 코드를 리팩토링 할 수 있습니다 생각합니다. 여기서하고있는 것처럼 클래스 속성을 반복 할 필요가 없습니다. 항목을 동적으로 추적하려는 경우 연관 배열을 사용하여 수행중인 클래스 수준이 아닌 방식으로 추적해야합니다.
강력한 데이터 입력을 원할 경우 벡터를 사용하십시오.

+0

네 말이 맞아. 그 면책 조항을 글로 표현한 것처럼 보입니다. 나는 벽돌 벽에 맞서고 ... 한숨을 쉬고있다. – Atriace