AS3 Словарь Вопросы - PullRequest
7 голосов
/ 29 июня 2011

Пара вопросов о классе Dictionary в Actionscript 3:

  1. Какой лучший способ проверить наличие неиспользованного ключа? Я делаю dictionary[key] == undefined прямо сейчас. Это самый быстрый и чистый способ?

  2. Нужно ли циклически проходить и delete dictionary[key] или я могу просто выпустить словарь из области видимости?

  3. Есть ли лучшее решение для отображения слушателей сообщений на класс вещания? Я делаю что-то вроде этого:

    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);
        }
    }
    

Я только что напечатал это сейчас, так что это может быть не на 100% точно. Хорошая идея использовать систему маршрутизации с таким словарем?

Ответы [ 2 ]

7 голосов
/ 29 июня 2011

1 - у вас есть два допустимых варианта: сравнить с undefined или сравнить с null. Разница такая:

  • undefined: значение вообще не существует
  • null: значение существует, но содержит ноль

Итак, вы выбираете, что подходит в вашем случае. Смотрите примеры.

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

2 - Я всегда делаю циклы по словарям, чтобы очистить их, когда у меня есть ссылки (а не только ptimitive типы, такие как числа или строки). Что ж, в этом нет необходимости, но так я немного помогу сборщику мусора, что, как правило, хорошая идея.

3 - Это меня озадачило. Зачем вам вещание таким образом? Это очень похоже на то, что у нас было несколько дней назад с классом AsBroadcaster в AS1-2, который не был изначально предоставлен нам возможностями вещания. AS3 имеет встроенную систему диспетчеризации событий, которую вы можете обновить в соответствии со своими потребностями (например, если вам нужно вести список слушателей для каждого типа событий).

Эти ссылки могут быть полезны:

2 голосов
/ 29 июня 2011
  1. Вы также можете написать if (!dictionary[key]) ...

  2. вы можете аннулировать объект словаря вместо циклического удаления всех ключей: dictionary = null;

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

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;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...