-イントロダクション
-なぜキー・バリュー・コーディングを使うのか?
-用語集
-キー・バリュー・コーディングの基礎
-キー・バリュー・コーディングのアクセッサメソッド
-キー値の検証
-キー・バリュー・コーディング準拠を保証する
-スカラー値と構造体のサポート
-配列の演算子
-アクセッサ検索の実装の詳細
-オブジェクトの関連を表記する
-パフォーマンス

- キー・バリュー・コーディング-
スカラー値と構造体のサポート

この文章は、Key-Value Coding: Scalar and Structure Support を翻訳したものです。

キー・バリュー・コーディングは、スカーラ値や構造体のサポートを、NSValue と NSNumber のインスタンスで自動的にラップすることで提供します。

目次

データをオブジェクトで表す
オブジェクトではないプロパティの nil 値を取り扱う
サポートされているスカラー値と構造体

データをオブジェクトで表す

valueForKey:setValue:forKey: のデフォルト実装は、「サポートされているスカラー値と構造体」で説明されるデータ型の自動的なオブジェクトでのラッピングのサポートを提供します。

valueForKey: が、指定されたキーに対する値を取り出すためのアクセッサメソッドかインスタンス変数を決定すると、返り値の型か、データ型が調べられます。返される値がオブジェクトでない場合は、NSNumber か NSValue のオブジェクトが作られて、返されます。

同様に、setValue:forKey: は、指定されたキーに対するアクセッサメソッドかインスタンス変数によって、データ型を決定します。データ型がオブジェクトではない場合は、適切な -<value> メソッドを使って、オブジェクトから値を取り出します。

オブジェクトではないプロパティの nil 値を取り扱う

setValue:forKey: が呼び出されるときに、オブジェクトではないプロパティに nil が渡されると、新たな問題が発生します。この場合、一般的な適切なアクションはありません。オブジェクトではなプロパティに nil が渡されると、受け手のオブジェクトは setNilValueForKey: メッセージを受け取ります。setNilValueForKey: のデフォルト実装は、NSInvalidArgumentException を投げます。サブクラスは、適切な実装を提供するために、このメソッドを上書きできます。

リスト 6-1 のコードは、float である age に対しては、nil の代わりに 0 を設定しようとします。

注意:下位互換性のために、受け手のクラスが NSObject の unableToSetNilForKey: を上書きしている場合は、setNilValueForKey: の代わりに unableToSetNilForKey: が呼び出されます。

リスト 6-1 setNilValueForKey: の実装の例

- (void)setNilValueForKey:(NSString *)theKey
{
    if ([theKey isEqualToString:@"age"]) {
        [self setValue:[NSNumber numberWithFloat:0.0] forKey:@"age"];
    }
    else 
        [super setNilValueForKey:theKey];
}

サポートされているスカラー値と構造体

表 6-1 は、NSNumber のインスタンスを使ってラップされる、サポートされているスカラー値の一覧です。表 6-2 は、NSvalue のインスタスを使ってラップされる、サポートされている構造体の一覧です。

表 6-1 NSNumber オブジェクトでラップされるスカラー値

Data typeCreation methodAccessor method
BOOLnumberWithBool:boolValue
charnumberWithChar:charValue
doublenumberWithDouble:doubleValue
floatnumberWithFloat:floatValue
intnumberWithInt:intValue
longnumberWithLong:longValue
long longnumberWithLongLong:longLongValue
shortnumberWithShort:shortValue
unsigned charnumberWithUnsignedChar:unsignedChar
unsigned intnumberWithUnsignedInt:unsignedInt
unsigned longnumberWithUnsignedLong:unsignedLong
unsigned long longnumberWithUnsignedLongLong:unsignedLongLong
unsigned shortnumberWithUnsignedShort:unsignedShort

表 6-2 NSNumber を使ってでラップされる共通な構造体

Data typeCreation methodAccessor method
NSPointvalueWithPoint:pointValue
NSRangevalueWithRange:rangeValue
NSRectvalueWithRect:rectValue
NSSizevalueWithSize:sizeValue


[Home] [Download] [Archives] [BBS] [Cocoa Programming Tips 1001] [Core Foundation の秘密] [Safari Developer Center] [はじめてのブラウザのつくり方] [Sketch BP] [スクリーンセイバーを作ろう] [Objective-C 最適化] [Authorization API 完全理解] [Mac OS X Programming Books Review] [オブジェクト指向の言語比較論] [panther-dev]

mailto: mkino@xd5.so-net.ne.jp