- キー・バリュー・コーディング-
スカラー値と構造体のサポート
キー・バリュー・コーディングは、スカーラ値や構造体のサポートを、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 type | Creation method | Accessor method |
| BOOL | numberWithBool: | boolValue |
| char | numberWithChar: | charValue |
| double | numberWithDouble: | doubleValue |
| float | numberWithFloat: | floatValue |
| int | numberWithInt: | intValue |
| long | numberWithLong: | longValue |
| long long | numberWithLongLong: | longLongValue |
| short | numberWithShort: | shortValue |
| unsigned char | numberWithUnsignedChar: | unsignedChar |
| unsigned int | numberWithUnsignedInt: | unsignedInt |
| unsigned long | numberWithUnsignedLong: | unsignedLong |
| unsigned long long | numberWithUnsignedLongLong: | unsignedLongLong |
| unsigned short | numberWithUnsignedShort: | unsignedShort |
表 6-2 NSNumber を使ってでラップされる共通な構造体
| Data type | Creation method | Accessor method |
| NSPoint | valueWithPoint: | pointValue |
| NSRange | valueWithRange: | rangeValue |
| NSRect | valueWithRect: | rectValue |
| NSSize | valueWithSize: | sizeValue |