Skip to content

Key-Value Coding Compliant Container Class

2010.07.15

Core Animation Programming Guide を読んでいると、Key-Value Coding Compliant Container Class というものが登場します。この記事では、Key-Value Coding Compliant Container Class の説明とその使い方について説明します。

Key-Value Coding Compliant Container Class は「任意のキーに任意の値を設定することができるクラス」のことを言います。

値の設定
[obj setValue:someValue forKey:someKey];
someKey に someValue を設定することができます。

値の取得
[obj valueForKey:someKey];
someKey に設定した値を取得することができます。

例えば、CAAnimation は Key-Value Coding Compliant Container Class です。CAAnimation には、identifier プロパティがないし、setIdentifier: メソッドもないので、普通なら identifier キーに値を設定することはできません。(厳密にはもう少し条件があります。Key-Value Coding Programming Guide を参照)
しかし、CAAnimation は Key-Value Coding Compliant Container Class なので identifier キーに値を設定することができます。

CAAnimation に identifier を割り当てておけば、animationDidStop:finished: が呼ばれたときに、どのアニメーションが停止したのか判別できるので便利です。
(下のコードのように)

- (void)method1
{
    // ...
    [animation1 setValue:@"Animation1" forKey:@"identifier"];
    [view addAnimation:animation1 forKey:@"Key1"];
}

- (void)method2
{
    // ...
    [animation2 setValue:@"Animation2" forKey:@"identifier"];
    [view addAnimation:animation2 forKey:@"Key2"];
}

- (void)animationDidStop:(CAAnimation *)theAnimation
    finished:(BOOL)flag
{
    NSString *identifier;
    identifier = [theAnimation valueForKey:@"identifier"];
    if ([identifier isEqualToString:@"Animation1"]) {
        // ...
    }
    else if ([identifier isEqualToString:@"Animation2"]) {
        // ...
    }
}

上の例では、CAAnimation に identifier を設定しました。CAAnimation のサブクラスを作らずに、identifier という拡張を実現できたわけです。このように、Key-Value Coding Compliant Container Class は、高い拡張性を持ったクラスと言えます。

次回は、Key-Value Coding Compliant Container Class の作り方について説明します。

Advertisements

From → Develop

Leave a Comment

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s