2011-06-28 22 views
7

kilka pytań dotyczących klasy Dictionary w ActionScript 3:AS3 Słownik Pytania

  1. Jaki jest najlepszy sposób, aby sprawdzić, nieużywany klucz? Teraz robię dictionary[key] == undefined. Czy to najszybszy i najczystszy sposób?

  2. Czy muszę przepuszczać i delete dictionary[key], czy mogę po prostu pozwolić słownikowi wykroczyć poza zakres?

  3. Czy istnieje lepsze rozwiązanie do mapowania słuchaczy wiadomości na klasę nadawania? I zrobić coś takiego:

    addListener(function : Function, messageType : Type) 
    { 
        if(dictionary[messageType] == undefined) 
         dictionary[messageType] = new Vector<Function>(); 
    
        dictionary[messageType].push(function); 
    } 
    
    broadcast(message : Message, messageType : Type) 
    { 
        if(dictionary[messageType] != undefined) 
        { 
         for each(var function : Function in dictionary[messageType]) 
          function(message); 
        } 
    } 
    

po prostu wpisane, że teraz, więc to nie może być w 100% dokładne. Dobry pomysł na wykorzystanie systemu routingu ze słownikiem takim jak ten?

+0

Dla n ° 1 jest również 'operatora in': 'if (klucz słownika)' które liczyć się najmilsze na co patrzeć. – RIAstar

Odpowiedz

2
  1. można również napisać if (!dictionary[key]) ...

  2. można unieważnić obiektu Dictionary zamiast pętli thru, aby usunąć wszystkie klucze: dictionary = null;

  3. napisałem klasę nadawcą i jesteś absolutnie mile widziane użyj go, jeśli chcesz! działa całkiem dobrze dla globalnej komunikacji między obiektami nie wyświetlającymi się. Jeśli jednak chcesz zezwolić na globalną komunikację między obiektami wyświetlanymi, możesz zamiast tego dodawać i wywoływać niestandardowe zdarzenia za pośrednictwem stołu montażowego - zakładając, że są one dodawane do sceny.

Broadcast.as

package com.mattie.events.broadcaster 
{ 
//Class 
public class Broadcast 
    { 
    //Variables 
    public var name:String; 
    public var data:Object; 

    //Constructor 
    public function Broadcast(name:String, data:Object) 
     { 
     this.name = name; 
     this.data = data; 
     } 
    } 
} 

Broadcaster.as

package com.mattie.events.broadcaster 
{ 
//Imports 
import flash.utils.Dictionary; 

//Class 
public final class Broadcaster 
    { 
    //Properties 
    private static var singleton:Broadcaster; 

    private var publicationsProperty:Dictionary; 
    private var subscriptionsProperty:Array; 

    //Constructor 
    public function Broadcaster() 
     { 
     if (singleton) 
      throw new Error("Broadcaster is a singleton that cannot be publically instantiated and is only accessible thru the \"broadcaster\" public property."); 

     publicationsProperty = new Dictionary(true); 
     subscriptionsProperty = new Array(); 
     } 

    //Publish Data 
    public function publish(name:String, data:Object = null):void 
     { 
     publicationsProperty[name] = data; 

     for (var i:uint = 0; i < subscriptionsProperty.length; i++) 
      if (subscriptionsProperty[i].name == name) 
       { 
       var handler:Function = subscriptionsProperty[i].handler; 
       handler(new Broadcast(name, data)); 
       } 
     } 

    //Subscribe Handler 
    public function subscribe(name:String, handler:Function):void 
     { 
     if (publicationsProperty[name]) 
      handler(new Broadcast(name, publicationsProperty[name])); 

     for (var i:uint = 0; i < subscriptionsProperty.length; i++) 
      if (subscriptionsProperty[i].name == name && subscriptionsProperty[i].handler == handler) 
       return; 

     subscriptionsProperty.push({name: name, handler: handler}); 
     } 

    //Unpublish Data 
    public function unpublish(name:String):void 
     { 
     delete publicationsProperty[name]; 
     } 

    //Unsubscribe Handler 
    public function unsubscribe(name:String, handler:Function):void 
     { 
     for (var i:uint = 0; i < subscriptionsProperty.length; i++) 
      if (subscriptionsProperty[i].name == name && subscriptionsProperty[i].handler == handler) 
       { 
       subscriptionsProperty.splice(i, 1); 
       return; 
       } 
     } 

    //Publications Getter 
    public function get publications():Dictionary 
     { 
     return publicationsProperty; 
     } 

    //Subscriptions Getter 
    public function get subscriptions():Array 
     { 
     return subscriptionsProperty; 
     } 

    //Singleton Getter 
    public static function get broadcaster():Broadcaster 
     { 
     if (!singleton) 
      singleton = new Broadcaster(); 

     return singleton; 
     } 
    } 
} 
+5

'if (! Słownik [klucz])' - może to być łatwo błędne, jeśli 'słownik [klucz] = fałsz' lub' słownik [klucz] = 0'. –

+0

ah, dobry połów. masz całkowitą rację. – TheDarkIn1978

7

- Masz dwie ważne opcje: porównanie z undefined lub porównać z null. Różnica jest tak:

  • undefined: wartość nie istnieje w ogóle
  • null: wartość istnieje, ale zawiera wartość null

więc wybrać to, co jest właściwe w danym przypadku. Zobacz przykłady.

import flash.utils.Dictionary; 

var test:Dictionary = new Dictionary(); 

trace(test[1] == null); // true, because null is internally converted to undefined 
trace(test[1] === null); // false, because of strictly typed comparison 
trace(test[1] == undefined); // true 
trace(test[1] === undefined); // true 

- Zawsze robię pętle poprzez słowników, aby oczyścić je, gdy mam referencje tam (i nie tylko ptimitive rodzajów takich liczb lub ciągów). Cóż, nie powinno to być konieczne, ale w ten sposób pomagam trochę garbage collectorowi, co jest generalnie dobrym pomysłem.

- To mnie denerwuje. Dlaczego potrzebujesz transmisji w ten sposób? Wygląda bardzo podobnie do tego, co mieliśmy kilka dni temu z klasą AsBroadcaster w AS1-2, która nie zapewniła nam możliwości nadawania.AS3 ma natywny system wysyłania zdarzeń, który możesz uaktualnić do swoich potrzeb (na przykład, jeśli potrzebujesz utrzymywać listę słuchaczy dla każdego typu zdarzenia).

Linki te mogą być przydatne:

+0

Można również użyć wyrażeń "w", np. 'if (klucz w słowniku) {...}' –